原题链接:http://noi.openjudge.cn/ch0305/1551/
- 先把原来的数据排序
- 按照从后往前的顺序枚举,因为要求的d是最大的
- a+b+c=d转化为a+b=d-c,变为两重循环,寻找a+b时,因为事先已经排好序,所以可以利用两边夹的思路,找到最终的位置。
#include <iostream>
#include <algorithm>
#include <string.h>
int num[1010];
int cmp(const void*a, const void*b) {
return *((int*)a) - *((int*)b);
}
int main() {
int n;
while (scanf("%d", &n) && n != 0) {
memset(num, 0, sizeof(num));
for (int i = 0;i < n;i++) {
scanf("%d", &num[i]);
}
qsort(num, n, sizeof(int), cmp);
int ans = -1;
for (int d = n;d;--d) {
for (int c = d-1;c;--c) {
int temp = num[d] - num[c];
int a, b;
a = 0, b = c - 1;
while (a < b) {
if (num[a] + num[b] == temp) {
ans = num[d];
break;
}
else if (num[a] + num[b] < temp) {
a++;
}
else {
b--;
}
}
if (ans != -1) {
break;
}
}
if (ans != -1) {
break;
}
}
if (ans == -1) {
printf("no solution\n");
}
else {
printf("%d\n", ans);
}
}
return 0;
}