https://vjudge.net/problem/UVA-10125
$a+b+c=d\rightarrow a+b=d-c$
双向枚举即可
#include<bits/stdc++.h> using namespace std; const int N=1005; int n,num[N]; map<int,int> hash1,hash2; int main() { while(233) { scanf("%d",&n); if(n==0) break; hash1.clear();hash2.clear(); for(int i=1;i<=n;++i) { scanf("%d",&num[i]); hash1[num[i]]=1; } for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) { if(hash2.find(num[i]+num[j])==hash2.end()) hash2[num[i]+num[j]]=1; else hash2[num[i]+num[j]]+=1; } int ans=-536870913; for(int i=1;i<=n;++i) { if(num[i]<ans) continue; for(int j=1;j<=n;++j) if(i!=j) hash2[num[i]+num[j]]-=1; for(int j=1;j<=n;++j) if(i!=j) { int s=num[i]-num[j]; int t=hash1.find(s-num[j])==hash1.end()?0:1; if(hash2[s]>t) { ans=max(ans,num[i]); break; } } for(int j=1;j<=n;++j) if(i!=j) hash2[num[i]+num[j]]+=1; } if(ans>-536870913) printf("%d\n",ans); else puts("no solution"); } return 0; }