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