牛客周赛 Round 56 D-构造故事 题型:排序枚举

19 阅读1分钟

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;
}

image.png