/*
普通解法,超时!
*/
#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;
else
return -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]);
else
printf("no solution\n");
}
return 0;
}
/* 推荐题型:五星 题意:从数集中找出满足条件: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"); else printf("%lld\n",a[max]); } return 0; }
/* 推荐题型:五星 题意:从数集中找出满足条件: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"); else printf("%lld\n",a[max]); } return 0; }