题目大意是,给你n个棍子,然后由q次操作,每次操作都是把编号为x的棍子拿走(每次操作都是针对n个棍子进行操作),然后问你此时这n-1根棍子能不能组成三角形,能的话输出最长的三角形周长,不能的话输出-1。
思路:要用贪心做,先给n条边按降序排序,这里注意要定义一个结构体,id存这条边排序前的位置(因为这里x是排序之前的位置),len存长度。排位序后,从第一长的边往后面扫,每次取连续的三条边,如果满足第一长的边的长度小于第二长的边的长度+第三长的边的长度,则这三条边的长度就是n-1根棍子组成三角形的最长周长了。如果扫完了,还是没遇到能构成三角形的三条边则说明这n-1条棍子不能组成三角形。
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct node
{
int id;
long long len;
}a[maxn];
int n,q;
bool cmp(const struct node&a,const struct node&b)
{
return a.len>b.len;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].len);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
long long flag,maxx,x;
while(q--)
{
maxx=-1;
scanf("%lld",&x);
for(int i=1;i<=(n-2);i++)
{
int f,g,h;
if(a[i].id==x)//用if嵌套找三条边里是否存在被顺溜拿走的边
{
continue;
}
else
if(a[i+1].id==x)
{
f=i;
g=i+2;
h=i+3;
}
else
if(a[i+2].id==x)
{
f=i;
g=i+1;
h=i+3;
}
else
{
f=i;
g=i+1;
h=i+2;
}
if(a[f].len<(a[g].len+a[h].len))
{
maxx=(a[f].len+a[g].len+a[h].len);
break;
}
}
printf("%lld
",maxx);
}
return 0;
}