这样转化为n^2的算法.
首先.把所有可能的a+b记录.
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
#define N 1005
#define inf 1000000000
struct ads
{
long a,b,data;
};
bool cmp(ads a,ads b)
{
if (a.data == b.data)
{
return a.a < b.a;
}
return a.data < b.data;
}
long S[N];
ads ade[N*N];
long adsN;
bool check(long a,long b,long data);
long find(long n);
int main()
{
long n,i,j;
while (scanf("%ld",&n) , n)
{
for (i = 0 ; i < n ; i ++)
{
scanf("%ld",&S[i]);
}
adsN=0;
for (i = 0 ; i < n ; i ++)
{
for (j = 0 ; j < n ; j ++)
{
if (i == j)
continue;
ade[adsN].a = S[i];
ade[adsN].b = S[j];
ade[adsN++].data = S[i] + S[j];
}
}
sort(ade, ade + adsN, cmp);
sort(S, S + n, greater<long>() );
long out = find(n);
if (out == inf)
{
printf("no solution\n");
}
else
printf("%d\n",out);
}
return 0;
}
bool check(long a,long b,long data)
{
ads t = {a, b, data};
ads *p = lower_bound(ade, ade + adsN, t, cmp);
if (p < ade + adsN && p >= ade && p->data == t.data)
{
if(p->a != a)
{
return true;
}
}
return false;
}
long find(long n)
{
long i,j;
for (i = 0 ; i < n ; i ++)
{
for (j = 0 ; j < n; j ++)
{
if (i == j)
continue;
long d = S[i];
long c = S[j];
if (check(-c,d,d - c) && check(c,d,d - c))
{
return d;
}
}
}
return inf;
}