首页 > 代码库 > 1267 4个数和为0
1267 4个数和为0
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-11-524
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 node13 {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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。