uva 10487 Closest Sums(二分搜索)

来源:互联网 发布:安卓电池电量优化 编辑:程序博客网 时间:2024/05/21 09:56

题目连接:10487 - Closest Sums


题目大意:给出n 个数值, 在对应给出m个查找数值,要求每个查找数值在最先给出的n个数值中找到两个数值,是的这两个数值的和是所有任意两两数值的和中最接进查找数值的。


解题思路:将n个数任意两两数值的和计算出来后储存在数组当中,然后从小到大排列,最后用二分的方法查找,注意有两个的话输出最小的。


#include <stdio.h>#include <set>#include <vector>#include <algorithm>using namespace std;const int N = 1005;int num[N];vector<int> sum;int main() {    int n, m, v, cas = 1;    vector<int>::iterator it;    while (scanf("%d", &n) == 1 && n) {sum.clear();for (int i = 0; i < n; i++) {    scanf("%d", &num[i]);    for (int j = 0; j < i; j++)sum.push_back(num[i] + num[j]);}sort(sum.begin(), sum.end());scanf("%d", &m);printf("Case %d:\n", cas++);for (int i = 0; i < m; i++) {    scanf("%d", &v);    it = lower_bound(sum.begin(),sum.end(), v);    int Min = *it;    if (it != sum.begin() && abs(*(it - 1) - v) < abs(Min - v))Min = *(it - 1);    printf("Closest sum to %d is %d.\n", v, Min);  }    }    return 0;}


原创粉丝点击