题目大意:
有n根棍子,第i根棍子的长度为a_i,现在要从这n根棍子中选出3根棍子,组成周长尽可能大的三角形,请输出最大的周长,如果不存在,就输出0。
解题思路:
这道题,我拿到后,先看了下数据n<100,直接O(n^3)的方法是可以过去的,但是为了得到更加快速的算法,用贪心处理下,其实就能优化到
O(nlogn)。
先说说O(n^3)的方法吧,其实就是先枚举出所有的能组成三角形的方案数目,然后在这些方案中将周长最大的找出来就可以了。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
# define MAX 123
int a[MAX];
int main(void)
{
int n;
while ( cin>>n )
{
int ans = 0;
for ( int i = 0;i < n;i++ )
cin>>a[i];
for ( int i = 0;i < n;i++ )
{
for ( int j = i+1;j < n;j++ )
{
for ( int k = j+1;k < n;k++ )
{
int len = a[i]+a[j]+a[k];
int _max = max(a[i],max(a[j],a[k]));
int res = len-_max;
if ( _max >= res )
continue;
else
{
ans = max(len,ans);
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
# define MAX 123
int a[MAX];
int cmp ( int x,int y )
{
return x > y;
}
int main(void)
{
int n;
while ( cin>>n )
{
int ans = 0;
for ( int i = 0;i < n;i++ )
cin>>a[i];
sort(a,a+n,cmp);
int flag = 0;
for ( int i = 0;i < n;i++ )
{
if ( i+2 >= n )
{
flag = 1;
break;
}
if ( a[i] >= a[i+1]+a[i+2] )
continue;
else
{
ans = a[i]+a[i+1]+a[i+2];
cout<<ans<<endl;
break;
}
}
if ( flag )
cout<<0<<endl;
}
return 0;
}