描述:哈希处理就可以了
#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;
}
10125 - Sumsets
最新推荐文章于 2018-06-15 17:22:48 发布