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
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; }
相关文章推荐
- UVa 10125 & POJ 2549 - Sumsets
- poj 2549 Sumsets
- poj 2549 Sumsets (枚举+二分)
- poj 2549 Sumsets
- poj 2549 Sumsets
- POJ - 2549 Sumsets
- POJ 2549
- poj 2229 B - Sumsets
- UVA 10125 - Sumsets(POJ 2549) hash
- poj2549——Sumsets
- poj 2549 Sumsets (折半枚举)
- poj 2549 折半枚举+二分
- poj 2229 Sumsets
- Sumsets (poj 2229 简单dp)
- poj 2229 B - Sumsets
- POJ 2229 Sumsets
- POJ-2549-Sumsets
- POJ 2549(中间相遇)
- poj 2229 B - Sumsets
- POJ 229 Sumsets