您的位置:首页 > 其它

poj 1840 Eqs

2011-03-09 15:12 471 查看
hash的应用,我直接映射了,差点超内存,听说有好的方法,这些数的范围还是很大的,-50^4*2·····50^4*2
,但是最多才100*100个数,所以可以通过hash函数映射,懒得想了
http://blog.csdn.net/ChinaCzy/archive/2010/08/05/5791573.aspx
#include<iostream>
using namespace std;
#define N 37500005
#define M 18750000
struct Hash
{
char index;
Hash(){index=0;}
};
Hash ys
;
int three(int i)
{
return i*i*i;
}
void init(Hash *h,int a1,int a2)
{
int i,j,temp;
for(i=-50;i<=50;i++)
{
if(i==0)
continue;
for(j=-50;j<=50;j++)
{
if(j==0)
continue;
temp=M-a1*three(i)-a2*three(j);
h[temp].index++;
}
}
}
int main()
{
int a1,a2,a3,a4,a5,i,j,k,temp,sum=0;
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
init(ys,a1,a2);
for(i=-50;i<=50;i++)
{
if(i==0)continue;
for(j=-50;j<=50;j++)
{
if(j==0)continue;
for(k=-50;k<=50;k++)
{
if(k==0)continue;
temp=a5*three(k)+a4*three(j)+a3*three(i)+M;
sum+=ys[temp].index;
}
}
}
printf("%d/n",sum);
return 0;
}


下面的是真正的hash,写了一下,速度差不多

#include<iostream>
using namespace std;
#define neg 12500000
#define N 10005
#define maxn 1000007
struct Hash
{
int index;
Hash *next;
Hash(){index=-1,next=NULL;}
Hash(int i){index=i,next=NULL;}
};
struct result
{
int data,cnt;
};
result res
;
Hash ys[maxn];
int m=0,_max=-100000000,_min=100000000;
int found(Hash *h,int sum)
{
int temp=sum%maxn;
if(h[temp].index==-1)
return 0;
Hash *ptr=&h[temp];
while(ptr)
{
if(res[ptr->index].data==sum)
return res[ptr->index].cnt;
ptr=ptr->next;
}
return 0;
}
int three(int i)
{
return i*i*i;
}
void init(Hash *h,int a1,int a2)
{
int i,j,sum;
Hash *ptr;
bool t;
for(i=-50;i<=50;i++)
{
if(i==0)continue;
for(j=-50;j<=50;j++)
{
if(j==0)continue;
sum=neg-a1*three(i)-a2*three(j);
if(sum>_max)
_max=sum;
if(sum<_min)
_min=sum;
if(h[sum%maxn].index==-1)
{
res[m].cnt=1;
res[m].data=sum;
h[sum%maxn].index=m++;
}
else
{
t=false;
ptr=&h[sum%maxn];
while(ptr)
{
if(res[ptr->index].data==sum)
{
res[ptr->index].cnt++;
t=true;
break;
}
ptr=ptr->next;
}
if(!t)
{
res[m].cnt=1;
res[m].data=sum;
ptr=&h[sum%maxn];
while(ptr->next)
ptr=ptr->next;
ptr->next=new Hash(m++);
}
}
}
}
}
int main()
{
int a1,a2,a3,a4,a5;
int i,j,k,m=0,sum;
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
init(ys,a1,a2);
for(i=-50;i<=50;i++)
{
if(i==0)continue;
for(j=-50;j<=50;j++)
{
if(j==0)continue;
for(k=-50;k<=50;k++)
{
if(k==0)continue;
sum=neg+a3*three(i)+a4*three(j)+a5*three(k);
if(sum>_max||sum<_min)
continue;
m+=found(ys,sum);
}
}
}
printf("%d/n",m);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: