题目大意:
给出的数中,任意两个数相加,找出最接近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;
}