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
5 2 3 5 7 12 5 2 16 64 256 1024 0
Output for Sample Input
12 no 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;}