读书人

uva 10125 - Sumsets美题

发布时间: 2012-08-30 09:55:54 作者: rapoo

uva 10125 - Sumsets好题

#include<cstdlib>#include<iostream>#include<cstdio>#include<cmath>#include<set>#include<cstring>#include <algorithm>#define M 5368#define N 1000010#define inf 0x7f7f7f7fusing namespace std;int head[N],next[N];int a[1000],sum[N],st[N][2];int hash(int u){//    u=((u<<1)+(u>>1))/2;//    return (u & 0x7fffffff)%N;    if(a<0)        a=-a;    return a%N;}void insert(int k){    int h=hash(sum[k]);    next[k]=head[h];    head[h]=k;}int find(int x,int y,int s){    int h=hash(s);    h=head[h];//容易忘掉!!wa    while(h!=-1)    {        if(s==sum[h]&&st[h][0]!=x&&st[h][0]!=y&&st[h][1]!=x&&st[h][1]!=y)            return 1;        h=next[h];    }    return 0;}int main(){#ifndef ONLINE_JUDGE    freopen("ex.in","r",stdin);#endif    int n;    while(scanf("%d",&n))    {        memset(head,-1,sizeof(head));        if(!n)            break;        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        sort(a,a+n);        int k=0;        for(int i=0; i<n; i++)            for(int j=i+1; j<n; j++)//降为o(n^2)            {                sum[k]=a[i]+a[j];                insert(k);                st[k][0]=i;                st[k++][1]=j;            }        int flag=1;        for(int i=n-1; i>=0; i--)        {            for(int j=0; j<n; j++)                if(i==j)                    continue;                else if(find(i,j,a[i]-a[j]))                {                    flag=0;                    printf("%d\n",a[i]);                    break;                }            if(!flag)                break;        }        if(flag)            printf("no solution\n");    }    return 0;}

读书人网 >编程

热点推荐