您的位置:首页 > 其它

poj 2549 Sumsets

2011-04-07 21:25 190 查看
hash应用。

a+b+c=d,各个值都是不等的,用四个循环肯定超时,所以把c移到右边,则变成两个两重循环。把数存于s[]数组中。因为这些数比较大,所以把取模作为hash函数,关键值就是abs(s[i]+s[j])%N,并把i与j存于res数组中,hash表中存放的是res数组的下标。判断成立的条件:h=res[ptr->index].i

k=res[ptr->index].j

s[h]+s[k]==s[i]-s[j]&&i!=h&&i!=k&&j!=h&&j!=k

#include<iostream>
#include<cmath>
#include<cstdlib>
#define N 19997
using namespace std;
struct Hash
{
int index;
Hash *next;
};
Hash *ys
;
struct result
{
int i,j;
}res[500005];
int s[1005];
int cmp(const void *a,const void *b)
{
return *((int *)a)-*((int *)b);
}
int main()
{
int n,i,j,temp,m,h,k;
Hash *ptr;
bool find;
while(scanf("%d",&n))
{
if(n==0)
break;
find=m=0;
for(i=1;i<=n;i++)
scanf("%d",s+i);
qsort(s+1,n,sizeof(s[1]),cmp);
for(i=0;i<N;i++)
ys[i]=NULL;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
temp=abs(s[i]+s[j])%N;
res[m].i=i;
res[m].j=j;
ptr=new Hash;
ptr->index=m++;
ptr->next=ys[temp];
ys[temp]=ptr;
}
for(i=n;i>1;i--)
{
if(find)
break;
for(j=i-1;j>=1;j--)
{
if(find)
break;
temp=abs(s[i]-s[j])%N;
ptr=ys[temp];
while(ptr)
{
h=res[ptr->index].i;
k=res[ptr->index].j;
if(s[h]+s[k]==s[i]-s[j]&&i!=h&&i!=k&&j!=h&&j!=k)
{
find=true;
break;
}
ptr=ptr->next;
}
}
}
if(find)
printf("%d/n",s[i+1]);
else
printf("no solution/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: