POJ - 2549 Sumsets(折半枚举)

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值