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
- UVa 10125 - Sumsets
- uva 10125 - Sumsets
- uva 10125 Sumsets
- UVa 10125 - Sumsets
- uva 10125 - Sumsets
- UVA 10125 Sumsets
- UVA 10125 - Sumsets
- UVa 10125-Sumsets
- UVa:10125 Sumsets
- uva 10125 Sumsets
- UVA 10125 Sumsets
- UVa 10125 - Sumsets
- UVA 10125 - Sumsets
- UVA - 10125 Sumsets
- UVA - 10125 Sumsets
- uva 10125 - Sumsets
- UVA 10125(p89)----Sumsets
- UVA 10125 Sumsets .
- ROS实践(4)-消息服务
- SQL游标(循环)单层和双层
- 用route命令添加永久路由
- 视觉SLAM漫谈(二):图优化理论与g2o的使用
- python的 a,b=b,a+b 和 a=b b=a+b 的区别
- UVA - 10125 Sumsets
- 2016/11/9
- 视觉SLAM漫谈 (三): 研究点介绍
- Linux 双网卡(内外网) 同时使用路由设置
- Android低版本图片
- Android自定义Dialog仿IOS的Dialog
- mysql主从复制
- 逆向工程小窥
- Android 详细分析AppBarLayout的五种ScrollFlags