UVa 10125-Sumsets

要求求出集合S中a + b + c = d中最大的d值。暴力的枚举一定超时的,所以需要找到一个优化的方式枚举,可以转化成 a + b = d - c.将集合排序,从大到小枚举d和c。然后在从1到c的前一位枚举。最后输出d即可

/*************************************************************************
    > File Name: 10125.cpp
    > Author: Toy
    > Mail: ycsgldy@163.com 
    > Created Time: 2013年05月30日 星期四 20时40分52秒
 ************************************************************************/

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <sstream>
#include <fstream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>

using namespace std;
const int INF = 0x7fffffff;
int Case;
int A[1010], ii;

int main ( ) {
	while ( scanf ( "%d", &Case ) == 1 && Case ) {
		for ( int i = 1; i <= Case; ++i )
			scanf ( "%d", &A[i] );
		sort ( A + 1, A + Case + 1 );
		bool flag = 0;
		for ( int i = Case; i >= 1; --i ) {
			for ( int j = Case; j >= 1; --j ) {
				if ( j != i ) {
					int tmp = A[i] - A[j];
					int lift = 1, right = j - 1;
					while ( lift < right ) {
						int cnt = A[lift] + A[right];
						if ( cnt == tmp ) { ii = i, flag = 1; break; }
						else if ( cnt < tmp ) lift++;
					    else right--;
					}
				}
				if ( flag ) break;
			}
			if ( flag ) break;
		}
	    if ( flag ) printf ( "%d\n", A[ii] );
	    else printf ( "no solution\n" );
	}
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值