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 }
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 }