题解:
三角形的判断:两边之和大于第三边
要求最大第一个想到的肯定就是排序了(它题目没说一定按顺序给)但是排完顺序 你还得知道这根木条原来是在哪里 所以我选择了结构体
我是从小到大的 (从大到小也行) 排完顺序以后 从最后一个开始 加符合题意的三个(这里指下标不等于拿走的)当加到三根时判断一下这三根是否满足三角形的判断条件
(a[i]+a[i+1]>a[i+2])这里只需要判断一次即可 不用像平时一样判断三个 因为已经排过序了 较大的两个加起来都比现在最大的要小了 再小一点的也没必要去判断了(节省时间)
如果不满足条件就减去当前加进去那个最大的就行了 (说不太清楚可能还是看代码比较简单一点)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
const int maxn = 1e5+5;
struct san{
ll len,id;
}a[maxn];
int cmp(san x,san y){
return x.len<y.len;
}
int main() {
int n,q;
cin>>n>>q;
for(int i = 0;i < n; i++){
cin>>a[i].len;
a[i].id = i+1;
}
sort(a,a+n,cmp);
for(int k = 0;k < q; k++){
int x;
cin>>x;
int f = 0;
ll sum = 0;
int num =0;
for(int i = n-1;i >= 0; i--){
if(a[i].id!=x){
sum+=a[i].len;
num++;
}
if(num == 3){
if(a[i].len+a[i+1].len>a[i+2].len){
cout<<sum<<endl;
f = 1;
break;
}else{
sum -= a[i+2].len;
num--;
}
}
}
if(f==0)cout<<-1<<endl;
}
return 0;
}