有n根棍子,棍子i 的长度ai。想从中选出3根棍子组成周长尽可能长的三角形,请输出最大周长,若无法组成则输出0.
限制:3<=n<=100
1<=ai<=10^6
输入:
5
2 3 4 5 10
输出:
12
一般情况下用三重循环即可,但这样的时间会很长,复杂度为O(n^3)。当n够大时,会超时。所以可以考虑另外一种时间上更高效的算法贪心算法,其时间复杂度为O(nlogn)。代码如下:
#include<cstdio>
#include<algorithm>
const int MAX_N=105;
void solve(int n,int *a)
{
std::sort(a,a+n);
int sum=0;
for(int i=n-1;i>1;--i)
{
if(a[i]+a[i-1]>a[i-2])
if(a[i]+a[i-2]>a[i-1])
if(a[i-1]+a[i-2]>a[i])
{sum=a[i]+a[i-1]+a[i-2];break;}
}
if(sum==0)
printf("0");
else
printf("%d",sum);
}
int main()
{
int n,a[MAX_N];
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
solve(n,a);
return 0;
}