UVA - 10125 Sumsets

来源:互联网 发布:java ee为什么这么小 编辑:程序博客网 时间:2024/06/06 11:01

题目大意:给一系列数字,范围 -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;}
0 0