题目大意:给一系列数字,范围 -536870912 ~ 536870911,a、b、c、d 都是集合中的数,找出满足 a+b+c=d 的最大的 d 并输出。
解题思路:套三个 for 暴力枚举直接 TLE……化为a+b=d-c,sum 保存 a+b 的和及对应 ab,然后将所给数字排列,从大到小枚举 d,输出符合的跳出循环即可。因为是集合所以四个数不能相等,然后 sum 注意一下虽然集合最多只有 1000 个数但是两两相加会有 500500 个和,刚开始数组开小了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
map<int, bool> m;
int num[1010];
struct node {
int a, b, s;
}sum[500510];
int cnt, flag, tag;
int main() {
int s;
while (scanf("%d", &s) && s) {
flag = cnt = tag = 0;
m.clear();
for (int i = 0; i < s; i++) {
scanf("%d", &num[cnt]);
m[num[cnt++]] = 1;
}
sort(num, num+cnt);
for (int i = 0; i < cnt; i++)
for (int j = i+1; j < cnt; j++) {
sum[tag].a = num[i];
sum[tag].b = num[j];
sum[tag++].s = num[i] + num[j];
}
for (int i = cnt-1; i >= 0; i--) {
for (int j = 0; j < tag; j++) {
int a = sum[j].a;
int b = sum[j].b;
int d = num[i];
int c = d - a - b;
if (!(m[a] && m[b] && m[c] && m[d])) continue;
if (a == c || a == d || b == c || b == d || c == d) continue;
flag = 1;
printf("%d\n", num[i]);
break;
}
if (flag) break;
}
if (!flag) printf("no solution\n");
}
return 0;
}