Sumsets
Time Limit: 1000MS | Memory Limit: 65536K | |
Total 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
5 2 3 5 7 12 5 2 16 64 256 1024 0
Sample Output
12 no 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; }