代码改变世界

1234. Playground

2011-05-12 09:55  Min·zc  阅读(201)  评论(0编辑  收藏  举报
 1 /*去掉半圆的圆弧,将半圆的两个端点连接起来就可以将问题抽象成给定一组边长
 2  *验证其能否构成闭合的多边形。构成闭合多边形的条件是出了最大边的所有边长之和
 3  *大于最大边。
 4  *所以首先对所有给定的边长进行排序,然后从最小的边长开始求和,看能否找到
 5  *能构成闭合多边形的条件的解
 6  *因为实际情况是给定的是半圆而不是直线,所以除最大边边长之和等于最大边也满足
 7  *条件
 8  *
 9  *
10  *
11  */
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 double r[30];
16 int cmp(const void* a, const void* b)
17 {
18         return *(double*)a>*(double*)b;
19 }
20 int main()
21 {
22         int n;
23         cin>>n;
24         while(n)
25         {
26                 for(int i=0;i<n;i++)
27                         cin>>r[i];
28                 qsort(r,n,sizeof(r[0]),cmp);
29         //     for(int i=0;i<n;i++)
30         //             cout<<r[i]<<" ";
31         //     cout<<endl;
32                 double sum=0;
33                 int flag=0;
34                 for(int i=0;i<n-1;i++)
35                 {
36                         sum+=r[i];
37                         if(i+1<n&&sum>=r[i+1])
38                         {
39                         //   cout<<sum<<" "<<r[i+1];
40                                 flag=1;
41                                 break;
42                         }
43                 }
44                 if(flag)
45                         cout<<"YES";
46                 else
47                 cout<<"NO";
48                 cout<<endl;
49                 cin>>n;
50         }
51 }