现在的位置: 首页 > 综合 > 正文

10125 – Sumsets

2014年01月21日 ⁄ 综合 ⁄ 共 995字 ⁄ 字号 评论关闭
描述:哈希处理就可以了
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define N 1000010
#define M 1010
int cmp(const void *p1,const void *p2)
{
    return  *(int *)p1 - *(int *)p2;
}
int num[M],head[N],next[N];
long long sum[N][3];
int n,flag,count;
void insert()
{
    int c=sum[count][0]%N;
    if(c<0) c=c+N;
    next[count]=head[c];
    head[c]=count;
}
void dfs(long long x,int i,int j)
{
    int c=x%N;
    if(c<0) c+=N;
    c=head[c];
    while(c!=-1)
    {
        if(x==sum[c][0]&&sum[c][1]!=i&&sum[c][2]!=i&&sum[c][1]!=j&&sum[c][2]!=j)
        {
            flag=1;
            printf("%d\n",num[i]);
            return;
        }
        c=next[c];
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("a.txt", "r", stdin);
#endif
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) break;
        flag=count=0;
        memset(head,-1,sizeof(head));
        memset(next,-1,sizeof(next));
        for(int j=0; j<n; j++)
            scanf("%d",&num[j]);
        qsort(num,n,sizeof(int),cmp);
        for(int i=0; i<n; i++)
            for(int j=i+1; j<n; j++)
                if(i!=j)
                {
                    sum[count][0]=num[i]+num[j];
                    sum[count][1]=i;
                    sum[count][2]=j;
                    insert();
                    count++;
                }
        for(int i=n-1; i>=0; i--)
        {
            for(int j=0; j<n; j++)
                if(i!=j)
                {
                    dfs(num[i]-num[j],i,j);
                    if(flag) break;
                }
            if(flag) break;
        }
        if(!flag) puts("no solution");
    }
    return 0;
}

抱歉!评论已关闭.