Description
可怜的lpx终于在别人的帮助下追上了aqx,可是他那瘦弱的身体想要去强行从aqx那里抢回烟那是不可能的。aqx看着可怜的lpx实在不忍心继续欺负他,便随手扔出来一堆长短不一的木棍,让lpx从中挑出来三根木棍,组成一个三角形,如果这个三角形的周长最大,那么aqx将把烟还给lpx。哎,可怜的lpx。。。
Input
多组数据,每组数据一个n(5<= n <=10^6),代表有n根木棍。
接下来n个整数Xi,代表第i根木棍的长为Xi (1<=Xi<=10^6)。
Output
能组成最大的三角形周长(保证有解)
Sample Input
4
1 2 3 4
Sample Output
9
解题思路:
三角的三条边要满足:
(1)任意两条边之和大于第三边
(2)任意两条边之差小于第三边
这里设一个三角形的三条边分别为X,Y,Z;且X>=Y>=Z
显然X>Y-Z, X+Y>Z, X+Z>Y 是成立的,如果X<Y+Z的话:
X-Y<Z, X-Z<Y
所以我们要做的就是把所有的边从大到小排序,然后从另最大的边作为X,如果次大的边为Y,再次大的边为Z,如果X<Y+Z,就输出X+Y+Z;否则X=Y,Y=Z,Z为下一个次大的边
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool bigComp(const int& r1,const int& r2)
{
return r1>r2;
}
int main()
{
vector<int> X;
vector<int>::iterator iter;
int n;
while(cin>>n)
{
X.clear();
for(int i=0;i<n;++i)
{
int t;
cin>>t;
X.push_back(t);
}
sort(X.begin(),X.end(),bigComp);
for(iter=X.begin();iter!=X.end()-2;++iter)
{
if(*iter<*(iter+1)+*(iter+2))
{
cout<<*iter+*(iter+1)+*(iter+2)<<endl;
break;
}
}
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s