POJ - 2549 Sumsets(折半枚举)

来源:互联网 发布:阿里云香港连不上 编辑:程序博客网 时间:2024/05/22 06:52
Sumsets
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 10573 Accepted: 2882

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

52 3 5 7 1252 16 64 256 10240

Sample Output

12no solution
题意:给你一个数列,找出四个数满足a + b + c = d,其中a,b,c,d不能相等,求解最大的d
直接折半枚举即可
/*头文件模板*/#include <map>#include <set>#include <cmath>#include <ctime>#include <queue>#include <vector>#include <cctype>#include <cstdio>#include <string>#include <cstring>#include <sstream>#include <cstdlib>#include <iomanip>#include <typeinfo>#include <iostream>#include <algorithm>#include <functional>using namespace std;#define pb push_back#define mp make_pair#define mem(a, x) memset(a, x, sizeof(a))#define copy(a, b) memcpy(a, b, sizeof(a))#define lson rt << 1, l, mid#define rson rt << 1|1, mid + 1, r#define FIN freopen("input.txt", "r", stdin)#define FOUT freopen("output.txt", "w", stdout)typedef long long LL;typedef pair<int, int > PII;typedef pair<int, string> PIS;typedef unsigned long long uLL;template<typename T>void print (T* p, T* q, string Gap = " ", bool flag = false) {int d = p < q ? 1 : -1;while (p != q) {if (flag) cout << Gap[0] << *p << Gap[1];else cout << *p;p += d;if (p != q && !flag) cout << Gap;}cout << endl;}template<typename T>void print (const T &a, string bes = "") {int len = bes.length();if (len >= 2) cout << bes[0] << a << bes[1] << endl;else cout << a << endl;}void IO_Init() {ios::sync_with_stdio (false);}LL LLabs (LL a) {return a > 0 ? a : -a;}const double PI = 3.1415926535898;const double eps = 1e-10;const int MAXM = 1e3 + 5;const int MAXN = 1e6 + 5;const LL INF = 1e15;/*头文件模板*/struct o {int l, r;LL v;o() {}o(int l, int r, LL v): l (l), r(r), v(v) {}bool operator < (const o &p) const {return  v < p.v;}bool operator < (const LL &d) const {return v < d;}};vector<LL>A;vector<o>B;int n;int main() {//FIN;while(~scanf("%d", &n), n) {A.clear(), B.clear();LL x;for(int i = 0; i < n; i ++) {scanf("%lld", &x);A.push_back(x);}sort(A.begin(), A.end());A.erase(unique(A.begin(), A.end()), A.end());int len = A.size();for(int i = 0; i < len; i ++) {for(int j = 0; j < i; j ++) {B.push_back(o(i, j, A[i] + A[j]));}}LL maxL = -INF;sort(B.begin(), B.end());for(int i = 0; i < len; i ++) {for(int j = 0; j < i; j ++) {LL c = A[i] - A[j];vector<o>::iterator it = lower_bound(B.begin(), B.end(), c);if(it != B.end() &&        i != it -> l &&        i != it -> r &&        j != it -> l &&        j != it -> r && c == it -> v) {maxL = max(maxL, A[i]);}}}if(maxL != -INF) {printf("%lld\n", maxL);} else {printf("no solution\n");}}return 0;}


1 0