首页 > 代码库 > [51nod] 1267 4个数和为0 暴力+二分
[51nod] 1267 4个数和为0 暴力+二分
给出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
暴力+排序+二分
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; int a[1100]; int main() { //freopen("1.txt", "r", stdin); int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a+n); for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) { int k, m, sum; k = j+1; m = n-1; while (k < m) { sum = a[i]+a[j]+a[k]+a[m]; if (sum < 0) { k++; } else if (sum > 0) { m--; } else { k++; m--; printf("Yes\n"); return 0; } } } printf("No\n"); return 0; }
还有个很好的思路,先把数组中任意两个数存起来,再从小到大排序,类似二分的思想从两头开始查找,是否满足sum1+sum2==0 并且两个坐标不重叠,每个点只选一次
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; int a[1100]; struct node { int x, y; int sum; }P[1100*1100]; int cmp(node a, node b) { return a.sum < b.sum; } int main() { freopen("1.txt", "r", stdin); int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); int k = 0; for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) { P[k].x = a[i]; P[k].y = a[j]; P[k++].sum = a[i]+a[j]; } sort(P, P+k, cmp); int l = 0, r = k-1; int flag = 0; while (l < r) { if (P[l].sum+P[r].sum==0 && P[l].x!=P[r].x && P[l].y!=P[r].y && P[l].x!=P[r].y && P[l].y != P[r].x) { flag = 1; break; } else if (P[l].sum+P[r].sum < 0) l++; else r--; } if (flag) printf("Yes\n"); else printf("No\n"); return 0; }
[51nod] 1267 4个数和为0 暴力+二分
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。