D-构造故事_牛客周赛 Round 56 (nowcoder.com)
思想
降序排序,这样开头的就是最长的边,判断次长边和次次长边相加是否大于最长边,如果大于那么就是一个合法三角形,然后计算一下周长.如果非法就i++,从下一个开始算.最后输出最大的周长
ps: 每个a[i]最大都可能是1e9,相加可能爆掉Int,需要开long long
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int a[N];
int ans;
void solve()
{
ans=-0x3f3f3f3f;
int n;cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n,greater<int>());
//枚举三根最长的火柴
for(int i=0;i<n-2;i++)
{
if(a[i]<a[i+1]+a[i+2])ans=max(ans,a[i]+a[i+1]+a[i+2]);
}
}
signed main()
{
int t;cin>>t;
while(t--)
{
solve();
if(ans==-0x3f3f3f3f)cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}