1267 4个数和为0

Posted SJY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1267 4个数和为0相关的知识,希望对你有一定的参考价值。

基准时间限制:1 秒 空间限制:131072 KB 分值: 20
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。
Input
第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)
Output
如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。
Input示例
5
-1
1
-5
2
4
Output示例
Yes
思路:二分+折半枚举;注意不能用任何一个重复的点。
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<queue>
 6 #include<math.h>
 7 #include<set>
 8 #include<vector>
 9 #include<string.h>
10 using namespace std;
11 typedef long long LL;
12 typedef struct node
13 {
14     int x;
15     int y;
16     LL sum;
17 } ss;
18 ss ans[1000005];
19 LL ak[1005];
20 bool check(int cn,int x);
21 bool cmp(node p, node q)
22 {
23     return p.sum<q.sum;
24 }
25 int main(void)
26 {
27     int N;
28     scanf("%d",&N);
29     int i,j;
30     for(i = 0; i < N; i++)
31     {
32         scanf("%lld",&ak[i]);
33     }
34     int cn = 0;
35     for(i = 0; i < N ; i++)
36     {
37         for(j = i+1; j < N; j++)
38         {
39             ans[cn].x = i;
40             ans[cn].y = j;
41             ans[cn].sum = ak[i] + ak[j];
42             cn++;
43         }
44     }
45     sort(ans,ans+cn,cmp); bool flag =false;
46     for(i = 0;i < cn ;i++)
47     {
48         flag = check(cn,i);
49         if(flag)break;
50     }
51     if(flag)printf("Yes\n");
52     else printf("No\n");
53     return 0;
54 }
55 bool check(int cn,int x)
56 {
57     int l = 0;
58     int r = cn -1;
59     int id = -1;
60     while(l <= r)
61     {  int mid = (l+r)/2;
62       if(ans[mid].sum <= -ans[x].sum)
63       {
64           id = mid;
65           l = mid+1;
66       }
67       else r = mid-1;
68     }
69     int cp = -1;
70     l = 0; r = cn-1;
71     while(l <= r)
72     {
73         int mid = (l+r)/2;
74         if(ans[mid].sum >= -ans[x].sum)
75         {
76             cp = mid;
77             r = mid-1;
78         }
79         else l = mid+1;
80     }
81     if(cp !=-1&&id !=-1)
82     {
83         for(int i = cp ;i <= id;i++)
84         {
85             if(ans[i].x!=ans[x].x&&ans[i].y!=ans[x].x&&ans[x].y!=ans[i].x&&ans[x].y!=ans[i].y)
86             {   
87                 return true;
88             }
89         }
90     }
91     return false;
92 }

 


以上是关于1267 4个数和为0的主要内容,如果未能解决你的问题,请参考以下文章

[51nod] 1267 4个数和为0

51 nod 1267 4个数和为0

51nod 1267 4个数和为0

[51nod] 1267 4个数和为0 暴力+二分

51nod 1267 4个数和为0

[51nod1267]4个数和为0(预处理+双指针)