您的位置:首页 > 其它

uva 10125和集 sumset(set)

2015-06-14 23:39 232 查看
给定数字集合,找出最大的d,使得a+b+c=d且abc均在数字集合中,集合元素数量不超过1000

思路是把等式变换为d-c=a+b,这样只要枚举d,c,验证d-c是否在任意两元素之和所在的集合中,注意abcd不能重复,所以需要一些额外的判重条件

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
#include<set>
#define eps 1e-6 
#define LL long long  
using namespace std;  

const int maxn = 1000 + 5;
const int INF = 0x3f3f3f3f;
//freopen("input.txt", "r", stdin);
multiset<int> su;
set<int> sumset;
int S[maxn];
int n;

void init() {
	su.clear();
	for(int i = 0; i < n; i++) { scanf("%d", &S[i]); sumset.insert(S[i]); } 
	for(int i = 0; i < n-1; i++) 
		for(int j = i + 1; j < n; j++) { su.insert(S[i]+S[j]); }
}

void solve() {
	int ans = -INF;
	for(int i = 0; i < n-1; i++)
		for(int j = i + 1; j < n; j++) {
			int cnt = 0;
			if(sumset.count(-S[j])) cnt++; if(sumset.count(S[i]-2*S[j])) cnt++;
			if(!S[j]) cnt--;
			if(su.count(S[i]-S[j])>cnt) ans = max(ans, S[i]);
			cnt = 0;
			if(sumset.count(-S[i])) cnt++; if(sumset.count(S[j]-2*S[i])) cnt++;
			if(!S[i]) cnt--;
			if(su.count(S[j]-S[i])>cnt) ans = max(ans, S[j]);
		}
	if(ans != -INF) printf("%d\n", ans);
	else puts("no solution");
}

int main() {
	//freopen("input.txt", "r", stdin);
	while(scanf("%d", &n) == 1 && n) {
		init();
		solve();
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: