2019中山大学程序设计竞赛 Triangle
今天水了一发hdu上的中山校赛 这个题交了将近十遍才过......
就是说给 n 个木棍,如果能找出3个能组成三角形的木棍就输出yes 反之输出no
乍一看很简单 一个排序遍历一遍就好了
但是n值太大了,我试了一下,就算不加sort都会TLE......
问了一下大神才想出这个关键的条件:
假设 a1=1,a2=2,a3=3 那么这是最小的三个不能组成三角形的木棍,
所以如果n=4,那么a4最小是a2+a3=5
n=5,a5最小是8
................
当n=47时,a47=4807526976 这是大于题目中所给的 2^32 的条件的 所以如果输入的n>47就可以判断是yes了 如果小于47 遍历一遍也不慢~
#include<bits/stdc++.h> using namespace std; int i,n,a[5000005]; int main() { while(scanf("%d",&n)!=EOF) { int flag=0; for(i=0;i<n;i++) scanf("%d",&a[i]); if(n>47) cout<<"YES"<<endl; else { sort(a,a+n); for(i=n-1;i>=2;i--) { if(a[i-2]+a[i-1]>a[i]) { flag=1; break; } } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } }