10125 - Sumsets(*****)

来源:互联网 发布:农村淘宝名片 编辑:程序博客网 时间:2024/05/18 08:31

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=111&page=show_problem&problem=1066

/*推荐题型:五星题意:从数集中找出满足条件:d=a+b+c的所有情况,输出d可取的最大值hash函数处理,使用数组head和next来实现。*/#include <cstdio>#include <cstring>#include <algorithm>const int hMax=1000010,nMax=1010;int head[hMax],next[hMax];int st[hMax][2];long long a[nMax],sum[hMax];int hash(long long u){u=(((int)u<<1)+((int)u>>1))/2;return (u & 0x7fffffff)%hMax;}void insert(int k){int h=hash(sum[k]);next[k]=head[h];head[h]=k;}bool find(int x,int y,long long ans){int h=hash(ans);for(int i=head[h];i!=-1;i=next[i])if(sum[i]==ans && st[i][0]!=x && st[i][0]!=y && st[i][1]!=x && st[i][1]!=y)return true;return false;}int main(){//freopen("data.in","r",stdin);int n;while(scanf("%d",&n) && n){memset(head,-1,sizeof(head));for(int i=0;i<n;i++)scanf("%lld",&a[i]);std::sort(a,a+n);int k=0;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++){sum[k]=a[i]+a[j];st[k][0]=i;st[k][1]=j;insert(k);k++;}int max=-1;for(int i=n-1;i>=0 && max==-1;i--)for(int j=0;j<n && max==-1;j++)if(i==j)continue;else{if(find(i,j,a[i]-a[j]))max=i;}if(max==-1)printf("no solution\n");elseprintf("%lld\n",a[max]);}return 0;}/*普通解法,超时!*/#include <cstdio>#include <algorithm>//using namespace std;int n,S[1010];int search(int u){bool ok=false;int left=0,right=n-1,mid;while(left<=right){mid=(left+right)/2;if(u>S[mid])left=mid+1;else if(u<S[mid])right=mid-1;else{ok=true;break;}}if(ok)return mid;else if(left==n)return -2;elsereturn -1;}int main(){//freopen("data.in","r",stdin);int count;while(scanf("%d",&n)==1){if(n==0)break;count=0;for(int i=0;i<n;i++)scanf("%d",&S[i]);std::sort(S,S+n);int max=-1;for(int a=0;a<n;a++)for(int b=a+1;b<n;b++)for(int c=b+1;c<n;c++){int k=search(S[a]+S[b]+S[c]);if(k>=0){if(k>max)max=k;}else if(k==-2)break;}if(max!=-1)printf("%d\n",S[max]);elseprintf("no solution\n");}return 0;}


原创粉丝点击