uva 10125 Sumsets(搜索)
2013-08-15 22:35
417 查看
Sumsets
Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S.
Input
Several S, each consisting of a line containing an integer 1 <= n <= 1000 indicating the number of elements in S, followed by the elements ofS, one per line. Each element of S is a distinct integer between -536870912 and +536870911 inclusive. The last line of input contains 0.
Output
For each S, a single line containing d, or a single line containing "no solution".
Sample Input
5 2 3 5 7 12 5 2 16 64 256 1024 0
Output for Sample Input
12 no solution
题目大意:给出n个数,找出n个数中满足a + b + c = d,的组合,输出d,不存在输出”no soluution",(注意d要求最大)
解题思路:首先将n个数排序,从最大的数开始遍历,,而a也从最大的开始遍历,然后求的d - a的值,将b 和 c分别从最大和最小的地方遍历,知道b < c 为止,如果b + c > d - a ,b应该向小一点的数值移动,反之,c向大一点的数值移动。等于的时候即是满足的情况。
#include <stdio.h> #include <algorithm> using namespace std; const int N = 1005; int answer, a, b, c, d, n; int num ; bool find() { for (a = n - 1; a >= 0; a--) { for (b = n - 1; b > 0; b--) { if (a == b) continue; answer = num[a] - num[b]; for (c = 0, d = b - 1; c < d; ) { if (num[c] + num[d] == answer) return true; else if (num[c] + num[d] < answer) c++; else d--; } } } return false; } int main() { while (scanf("%d",&n) == 1 && n) { for (int i = 0; i < n; i++) scanf("%d", &num[i]); sort(num, num + n); if (find()) printf("%d\n", num[a]); else printf("no solution\n"); } return 0;}
相关文章推荐
- UVa10125--Sumsets(折半搜索)
- uva 10125 - Sumsets
- UVA 10125 Sumsets
- UVA 10125 Sumsets .
- uva 10125 - Sumsets(a+b+c=d)
- UVA 10125 Sumsets——折半查找
- uva 10125 - Sumsets
- UVa 10125 - Sumsets (中途相遇法 hash)
- UVa 10125-Sumsets
- UVA - 10125 - Sumsets (暴力枚举 + STL)
- 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