poj 1840 Eqs(hash表)
这题是用的stl中的map容器做的,刚开始想用暴力来着,看看了别人给的提示,无疑暴力一定会TL,所以改变策略,想通过hash表来做(本来这道题就是在hash的练习里,所以直接想到用hash了),可是无论你是先算前两个还是前三个,都没法确定数组要开多大,第一次先开了一个10w的数组,结果还是不行,因为题目中没给a1,a2,a3,a4,a5的范围,不好开数组。
搜了解题报告,看见有人用stl中map容器做的,又去学了下map容器的用法,http://hi.baidu.com/dizemmm/blog/item/29383e4eb564fa00b3de05d6.html
其实这题很简单,就是在开数组上有点犯难,可以看一下我的代码:
#include<stdio.h>
#include<map>
using namespace std;
map<int,int>Hash;
int s[105];
void init()
{
int i=0;
for(i=-50;i<=50;i++)s[i+50]=i*i*i;
}
int main()
{
int a[5];
int i,j,k,sum;
while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4])!=EOF)
{
init();
for(i=-50;i<=50;i++)
if(i)
{
for(j=-50;j<=50;j++)
{
if(j)
{
sum=a[0]*s[i+50]+a[1]*s[j+50];
if(Hash.end()==Hash.find(sum))Hash[sum]=1;
else Hash[sum]++;
}
}
}
int num=0;
for(i=-50;i<=50;i++)
if(i)
{
for(j=-50;j<=50;j++)
if(j)
{
for(k=-50;k<=50;k++)
if(k)
{
sum=a[2]*s[i+50]+a[3]*s[j+50]+a[4]*s[k+50];
if(Hash.end()!=Hash.find(0-sum)) num+=Hash[sum];
}
}
}
printf("%d\n",num);
}
return 0;
}