uva10487

题目大意:
给出的数中,任意两个数相加,找出最接近query的数。

思路:
把任意两个数加起来之后,排序完之后,用lower_bound找到插入query的位置,然后找到它左右两边的与它最近的数。输出就可以了。

代码:

#include <iostream>
#include <cstdio>
using namespace std;
#include <cstring>
#include <algorithm>
#include <cstdlib>

int num[1005];
int cases = 0,n,m,query[30],s[1000000 + 10];

int main() {

    int sum = -1,T = 1;
    while(scanf("%d",&n)!=EOF && n) {
        sum = -1;
        printf("Case %d:\n",T++);
        for(int i = 0; i < n ; i++)
            scanf("%d",&num[i]);
        scanf("%d",&m);
        for(int i = 0 ; i < m ; i++)
            scanf("%d",&query[i]);
        for(int i =0 ; i < n; i++) {
            for(int j = 0 ; j < n ; j++) {
                if(i == j)
                    continue;
                s[++sum] = num[i] + num[j];
            }
        }
        sort(s,s+sum);
        for(int i = 0 ; i < m ; i++) {
            int j = lower_bound(s,s+sum,query[i]) - s;
            if(j == sum)
                printf("Closest sum to %d is %d.\n", query[i],s[sum-1]);
            else if(j <= 0)
                printf("Closest sum to %d is %d.\n", query[i], s[0]); 
            else {
                if(abs(s[j - 1] - query[i]) > abs(s[j] - query[i]))
                    printf("Closest sum to %d is %d.\n", query[i], s[j]);
                else
                    printf("Closest sum to %d is %d.\n", query[i],s[j-1]); 
            }
        }
    }
    return 0;
}

你可能感兴趣的:(uva10487)