题目大意:
有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; }
O(nlogn)的算法,我们可以开始对于所有的边长sort一遍,时间复杂度就是O(nlogn),然后从i = 0,开始,连续的取出3条边来,如果这三条边能够组成三角形,那么他们就是我们要找的最大的边长了,因为边长一开始是通过从大到小的顺序排出来的,如果i+2>=n了,那么我们就认为在有限的条件下已经没有解能够使三角形的周长最大了。因为i+2的最大值只能取到n-1。。。。
代码:
# 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; }