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
题目给的标签是二分,然而我自己当时还不懂二分。。。想起POJ上有一道是解5元方程的一道题,将暴力的O(n^5)方法用哈希降到了O(n^3),于是就用哈希方法过了,但是真没想到51nod居然没有卡这么幼稚的哈希。。。

代码:

#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;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-09-06 15:42  光速小子  阅读(192)  评论(0编辑  收藏  举报

导航