因为要找a+b+c=d,所以可以写成,a+b=d-c,枚举d,c,然后求出和数组(a+b),再在这个数组里尔分查找即可。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define LL long long using namespace std; int a[1005],b[1005]; struct pi{ int s; int x,y; }pp[1000005]; int cmp(pi a,pi b){ return a.s<b.s; } int get(int p,int n){ int le,ri,mid; le=0; ri=n-1; while(le<=ri){ mid=(le+ri)/2; if(pp[mid].s<p) le=mid+1; else ri=mid-1; } return le; } int main() { int i,j,n,m,p,k,f,q; while(1){ scanf("%d",&n); if(n==0) break; for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); p=0; i=0; while(i<n){ if(i==0) b[p++]=a[i++]; else{ if(a[i]!=a[i-1]) b[p++]=a[i++]; else{ f=1; while(i<n&&a[i]==a[i-1]){ f++; if(f<=4) b[p++]=a[i]; i++; } } } } n=p; for(i=0;i<n;i++) a[i]=b[i]; p=0; for(i=0;i<n;i++){ for(j=0;j<i;j++){ pp[p].s=a[i]+a[j]; pp[p].x=j; pp[p++].y=i; } } sort(pp,pp+p,cmp); m=-1000000000; for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i==j) continue; k=a[i]-a[j]; f=0; q=get(k,p); while(q<p&&pp[q].s==k){ if(pp[q].x!=i&&pp[q].y!=j&&pp[q].y!=i&&pp[q].x!=j){ f=1; break; } q++; } if(f) m=max(m,a[i]); } } if(m==-1000000000){ printf("no solution\n"); } else printf("%d\n",m); } }