uva 10125 Sumsets(搜索)

来源:互联网 发布:centos无线网络配置 编辑:程序博客网 时间:2024/05/22 03:44

Sumsets

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

Output for Sample Input

12no solution

题目大意:给出n个数,找出n个数中满足a + b + c = d,的组合,输出d,不存在输出”no soluution",(注意d要求最大)

解题思路:首先将n个数排序,从最大的数开始遍历,,而a也从最大的开始遍历,然后求的d - a的值,将b 和 c分别从最大和最小的地方遍历,知道b < c 为止,如果b  + c > d - a ,b应该向小一点的数值移动,反之,c向大一点的数值移动。等于的时候即是满足的情况。

#include <stdio.h>#include <algorithm>using namespace std;const int N = 1005;int answer, a, b, c, d, n;int num[N];bool find() {    for (a = n - 1; a >= 0; a--) {for (b = n - 1; b > 0; b--) {    if (a == b)continue;    answer = num[a] - num[b];    for (c = 0, d = b - 1; c < d; ) {if (num[c] + num[d] == answer)    return true;else if (num[c] + num[d] < answer)    c++;else    d--;    }}    }    return false;}int main() {    while (scanf("%d",&n) == 1 && n) {for (int i = 0; i < n; i++)    scanf("%d", &num[i]);sort(num, num + n);if (find())    printf("%d\n", num[a]);else    printf("no solution\n");    }    return 0;}