51nod 1267 4个数和为0 - 二分+排序

分析:

将四个数字相加,分解成两个数相加,排序  找答案

注意:比较四个数是否相等  不能直接四个数!=  不要偷懒!

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn = 1e6+5;
 6 
 7 struct node{
 8     int a;
 9     int b;
10     int sum;
11 }a[maxn];
12 int n, f[1005];
13 bool cmp(node a, node b)
14 {
15     return a.sum < b.sum;
16 }
17 bool check(int i, int j)
18 {    
19     if(a[i].a != a[j].b && a[i].a != a[i].b && a[i].b != a[j].b && a[i].b != a[j].b) return true;
20     else return false;
21 }
22 int main()
23 {
24     int k = 0;
25     cin >> n;
26     for(int i = 1; i <= n; i++){
27         cin >> f[i];
28          for(int j = 1; j < i; j++){
29             a[k].a = i;
30             a[k].b = j;
31             a[k++].sum = f[i]+f[j];
32         }
33     }
34     sort(a,a+k,cmp);
35     int x = 0, y = k - 1, flag = 0;
36     while(x < y){
37         if(a[x].sum + a[y].sum == 0){
38             if(check(x,y)){
39                 flag = 1;
40                 break;
41             }
42             else if(a[x].sum == a[x+1].sum) x++;
43             else if(a[y].sum == a[y-1].sum) y--;
44             else{ 
45                 x++, y--;
46             }
47         }
48         else if(a[x].sum + a[y].sum < 0) x++;
49         else y--;
50     }
51     if(flag) cout << "Yes" << endl;
52     else cout << "No" << endl;
53     return 0;
54 }

 

posted @ 2018-08-13 15:02  愉也  阅读(188)  评论(0编辑  收藏  举报