注意二分查找,查找上界的时候,返回的是等于查找的数的第一个位置,如果没有,返回前面比他大那个数的位置,
如果全部数都比他大,则返回全部数的下一个坐标,注意这里。
查找下界的时候,返回的是小于等于b的最后一个元素的后面一个位置,如果全部都小于,返回第一个数前面那个数的坐标。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cctype>
#include<queue>
#define LL long long
using namespace std;
const int maxn=1e7+10;
const double eps=1e-8;
const int Max=2147483647;
int a[1010];
int sum[maxn];
int main()
{
int t=0;
int n;
while(cin>>n&&n)
{
t++;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int l=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
sum[l++]=a[i]+a[j];
sort(sum,sum+l);
// for(int i=0;i<l;i++)
// cout<<sum[i]<<' ';
// cout<<endl;
int m;
cin>>m;
cout<<"Case "<<t<<':'<<endl;
while(m--)
{
int tem;
scanf("%d",&tem);
int x=0,y=l;
while(x<y)
{
int m=x+(y-x)/2;
if(sum[m]>=tem)
y=m;
else
x=m+1;
}
int ans;
// cout<<x<<endl;
if(x==0||(x!=l&&sum[x]-tem<=tem-sum[x-1]))
ans=sum[x];
else
ans=sum[x-1];
printf("Closest sum to %d is %d.\n",tem,ans);
}
}
return 0;
}