51nod 1267:4个数和为0 哈希
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
给出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 <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #pragma warning(disable:4996) using namespace std; int n,i, j, num, m, z,x2,y2; long long val[1005]; map<long long, int>dic; vector<int>x[500005]; vector<int>y[500005]; int main() { scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%lld", val+i); } num = 0; for (i = 1; i <= n; i++) { for (j = i + 1; j <= n; j++) { if(dic[-(val[i] + val[j])]==0) dic[-(val[i] + val[j])] = ++num; x[num].push_back(i); y[num].push_back(j); } } for (i = 1; i < n; i++) { for (j = i + 1; j <= n; j++) { if (dic[val[i] + val[j]]) { z = x[dic[val[i] + val[j]]].size(); for (m = 0; m < z; m++) { x2 = x[dic[val[i] + val[j]]][m]; y2 = y[dic[val[i] + val[j]]][m]; if (i != x2 && j != y2 && i != y2 && j != x2) { cout << "Yes" << endl; return 0; } } } } } cout << "No" << endl; return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。