Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
3s | 8192K | 375 | 126 | Standard |
5 1 2 2 3 3 1 1
8 0
Problem Source: kscinow
This problem is used for contest: 54
刚开始看到这道题第一感觉就是深度优先枚举,这往往也是众多悲剧发生的原因,一看是多组测试数据而且又是N<=200000,深度优先枚举肯定TLE,所以就只能另寻他法,上网搜了搜,有了想法.
思路:先对所有的边进行一次排序,然后从后往前一次检测连续三条边能否构成三角形,如果找到了就跳出循环,输出结果,如果一直没用找到就输出0。
为什么这么做就可以呢?我们不妨假设被我们排好序的边中连续的三条是a,b,c(从小到大,可以相等),我们知道判定三角形的一个指标是两边之和大于第三边,另一个是两边之和小于第三边,其实我们只要检测前者即可,因为前者满足了后者就一定满足(我个人认为,没有证明过),所以对于a,b,c三条边,b,c都大于等于a,所以b+c>a,又因为c>=b所以c+a>b,所以我们只需要判定a+b是否大于c就可以了。
这样子问题是不是就很简单了。
注:排序的算法也很讲究啊,可别告诉我你要用冒泡法,我试了一下qsort,又试了一下STL里的sort,后者快了0.14s看来以后要试着C&C++混编了。
Code:
<textarea cols="50" rows="15" name="code" class="cpp">/* *JackyZheng *2010/12/06 *C&C++ */ #include<stdio.h> #include<stdlib.h> #include<algorithm> using namespace std; int a[200000]; //int cmp(const void* e1,const void* e2) //{ // return *((int*)e1)-*((int*)e2); //} int main() { int N; int flag; while(scanf("%d",&N)!=EOF) { flag=0; for(int i=0;i<N;i++) { scanf("%d",&a[i]); } sort(a,a+N); // qsort(a,N,sizeof(int),cmp); for(int i=N-1;i>=2;i--) { if(a[i-2]+a[i-1]>a[i]) { printf("%d/n",a[i-2]+a[i-1]+a[i]); flag=1; break; } } if(!flag) { printf("0/n"); } } return 0; } </textarea>