Sumsets
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11169 | Accepted: 3050 |
Description
Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.
Input
Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements of S, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.
Output
For each S, a single line containing d, or a single line containing "no solution".
Sample Input
5 2 3 5 7 12 5 2 16 64 256 1024 0
Sample Output
12 no solution
直接暴力的话O(n^4),所以要折半暴力,再加上二分
a+b+c=d,则a+b=d-c
因为题目要求的是存在即可,所以要枚举枚举所有的a+b或者d-c(可能d<c,因为存在负值,所以这种情况也可能存在),二分查找等号另外一边
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<iostream>
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5+10;
typedef long long LL;
using namespace std;
int s[maxn];
int main(){
int n;
while(scanf("%d", &n) == 1 && n){
for(int i = 0; i < n; i++) scanf("%d", &s[i]);
sort(s, s+n);
bool flag = false;
for(int i = n-1; i >= 0; i--){
for(int j = n-1; j >= 0; j--){
if(j == i) continue;
int l, r;
l = 0; r = j-1;
while(l < r){
if(s[i]-s[j] == s[l]+s[r]){
cout << s[i] << endl;
flag = true;
break;
}
if(s[l]+s[r] < s[i]-s[j]) l++;
else r--;
}
if(flag) break;
}
if(flag) break;
}
if(!flag) cout << "no solution" << endl;
}
return 0;
}