先对数组排序,再枚举+(二分或者map),O(n^3)*logn的复杂度.
#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
const int maxn = 1001;
int wages[maxn], n;
map<int,bool>exist;
bool bisearch(int x){
int l = 0, r = n - 1;
while(l <= r){
int mid = (l + r) >> 1;
if(wages[mid] == x)return true;
else if(wages[mid] > x)r = mid - 1;
else l = mid + 1;
}
return false;
}
int main(){
while(scanf("%d", &n) && n){
exist.clear();
for(int i = 0; i < n; ++i){
scanf("%d", &wages[i]);
exist[wages[i]] = 1;
}
int i, j, k;
sort(wages, wages + n);
for(i = n -1; i >= 0; --i){
for(j = n - 1; j >= 0; --j){
if(i == j)continue;
for(k = n - 1; k >= 0 ; --k){
if(k ==i || k == j)continue;
int left = wages[i] - wages[j] - wages[k];
if(left != wages[i] && left != wages[j] && left != wages[k] && bisearch(left)){
break;
}
}
if(k >= 0)break;
}
if(j >= 0)break;
}
if(i >= 0){
printf("%d\n",wages[i]);
}else{
printf("no solution\n");
}
}
return 0;
}