hdu-1496(hash)

hash表的作用还是很明显的。

大家看来hash表的主要作用就是用空间上的便利性来代替时间上的便利性。

那么hash好像能够解决所有的暴力枚举的‘百元买百鸡’的问题。

还是要学习一下hash的冲突处理方法,因为以后可能会遇到内存开不出来,

而数据又是散列的时候的问题,这个时候就要求我们用到冲突处理了。

hash是一种方法,是一种思路,所以必须掌握。

贴出代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

using namespace std;

const int MAXN = 1000011;

int a, b, c, d;

int hash1[MAXN];//代表正数 

int hash2[MAXN];//代表负数 


int main()
{
	while (scanf("%d%d%d%d", &a, &b, &c, &d) != EOF)
	{
		if (a >= 0 && b >= 0 && c >= 0 && d >= 0
			|| a <= 0 && b <= 0 && c <= 0 && d <= 0)
		{
			printf("0\n");
			continue;
		}
		/*
		这题目原来卡的就是初始化,我觉得如果我不用hash,
		暴力也能过。但是好像是有点大的。还是要掌握hash的方法的。 
		*/
		memset(hash1, 0, sizeof(hash1));
		memset(hash2, 0, sizeof(hash2));
		for (int i = 1; i <= 100; i++)
		{
			for (int j = 1; j <= 100; j++)
			{
				int sum = a * i * i + b * j * j;
				if (sum > 0)
				{
					hash1[sum]++;
				}
				else
				{
					hash2[-sum]++;
				}
			}
		}
		int cnt = 0;
		for (int i = 1; i <= 100; i++)
		{
			for (int j = 1; j <= 100; j++)
			{
				int sum = c * i * i + d * j * j;
				if (sum >= 0)
				{
					cnt += hash2[sum];
				}
				else
				{
					cnt += hash1[-sum];
				}	 
			}
		} 
		printf("%d\n", 16 * cnt);
	}
//	system("pause");
	return 0;
}




下面是贴出来的是用冲突法解决问题的hash。很巧妙,思想非常不错。

还有一道题目是4334也是这个类型,一会去看一看:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

using namespace std;

const int MAXN = 50021;

int f[MAXN];

int g[MAXN];

int hash(int num)
{
	int t = num % MAXN;
	if (t < 0)
	{
		t = (t + MAXN) % MAXN;
	}
	while (f[t] && g[t] != num)
	{
		t = (t + 1) % MAXN;
	}
	return t;
}


int main()
{
	int a, b, c, d;
	while (scanf("%d%d%d%d", &a, &b, &c, &d) != EOF)
	{
		if (a >= 0 && b >= 0 && c >= 0 && d >= 0 || 
			a <= 0 && b <= 0 && c <= 0 && d <= 0)
		{
			printf("0\n");
			continue;
		}
		memset(f, 0, sizeof(f));
		memset(g, 0, sizeof(g));
		int sum = 0;
		for (int i = 1; i <= 100; i++)
		{
			for (int j = 1; j <= 100; j++)
			{
				sum = a * i * i + b * j * j;
				int p = hash(sum);
				f[p]++;
				g[p] = sum;
			}
		}
		int cnt = 0;
		for (int i = 1; i <= 100; i++)
		{
			for (int j = 1; j <= 100; j++)
			{
				sum = -(c * i * i + d * j * j);
				int p = hash(sum);
				cnt += f[p];
			}
		}
		printf("%d\n", 16 * cnt);
	}
//	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值