uva 10125和集 sumset(set)
2015-06-14 23:39
232 查看
给定数字集合,找出最大的d,使得a+b+c=d且abc均在数字集合中,集合元素数量不超过1000
思路是把等式变换为d-c=a+b,这样只要枚举d,c,验证d-c是否在任意两元素之和所在的集合中,注意abcd不能重复,所以需要一些额外的判重条件
思路是把等式变换为d-c=a+b,这样只要枚举d,c,验证d-c是否在任意两元素之和所在的集合中,注意abcd不能重复,所以需要一些额外的判重条件
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<map> #include<set> #define eps 1e-6 #define LL long long using namespace std; const int maxn = 1000 + 5; const int INF = 0x3f3f3f3f; //freopen("input.txt", "r", stdin); multiset<int> su; set<int> sumset; int S[maxn]; int n; void init() { su.clear(); for(int i = 0; i < n; i++) { scanf("%d", &S[i]); sumset.insert(S[i]); } for(int i = 0; i < n-1; i++) for(int j = i + 1; j < n; j++) { su.insert(S[i]+S[j]); } } void solve() { int ans = -INF; for(int i = 0; i < n-1; i++) for(int j = i + 1; j < n; j++) { int cnt = 0; if(sumset.count(-S[j])) cnt++; if(sumset.count(S[i]-2*S[j])) cnt++; if(!S[j]) cnt--; if(su.count(S[i]-S[j])>cnt) ans = max(ans, S[i]); cnt = 0; if(sumset.count(-S[i])) cnt++; if(sumset.count(S[j]-2*S[i])) cnt++; if(!S[i]) cnt--; if(su.count(S[j]-S[i])>cnt) ans = max(ans, S[j]); } if(ans != -INF) printf("%d\n", ans); else puts("no solution"); } int main() { //freopen("input.txt", "r", stdin); while(scanf("%d", &n) == 1 && n) { init(); solve(); } return 0; }
相关文章推荐
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第一课:游戏原理与机制
- [转载]对iOS开发中内存管理的一点总结与理解
- SQL存储原理及聚集索引、非聚集索引、唯一索引、主键约束的关系(补)
- UVA 11300 分金币
- 派生类的访问控制-“三看”原则-派生类类成员访问级别设置的原则
- 派生类的访问控制-“三看”原则-派生类类成员访问级别设置的原则
- Hadoop的一个变长long编码剖析
- 解放双手——Android自动化测试
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- iOS开发系列--UITableView全面解析
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- github使用
- 2015061410 - 推荐知乎周刊
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- 《最后期限》阅读笔记(一)
- mv,Directory not empty不能目录覆盖
- Sidekiq错误处理
- mv,Directory not empty不能目录覆盖
- POJ 3281 Dining 最大流 Dinic算法
- 团队作业-第四周-面向对象程序设计