#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
int sum[1000000];
int n;
int res[1005];
int lowerbound(int x,int y,int v)
{
int m;
while (x<y)
{
m=x+(y-x)/2;
if (sum[m]>=v) y=m;
else x=m+1;
}
return x;
}//如果存在,则返回他出现的第一个位置,否则返回一个下标,在此处插入元素次序列仍然有序
int main()
{ int cas=1;
//freopen("sample.txt","r",stdin);
while (scanf("%d",&n)==1)
{
if (n==0) break;
int m;int kase=0;
printf("Case %d:\n",cas);
//首先是N=1的特殊情
for (int i=0;i<n;i++)
scanf("%d",&res[i]);
//还是特殊情况,
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++)
{
sum[kase++]=res[i]+res[j];
}
sort(sum,sum+kase);
scanf("%d",&m);
for (int i=0;i<m;i++)
{
int ss;
scanf("%d",&ss);
//两种特殊情况
if (ss<sum[0])
{
printf("Closest sum to %d is %d.\n",ss,sum[0]);
continue;
}
//第二种特殊情况
if (ss>sum[kase-1])
{
printf("Closest sum to %d is %d.\n",ss,sum[kase-1]);
continue;
}
int index=lowerbound(0,kase-1,ss);
// printf("%d\n",index);
if (sum[index]==ss) printf("Closest sum to %d is %d.\n",ss,sum[index]);
else
{
if (abs(sum[index]-ss)>abs(sum[index-1]-ss)) printf("Closest sum to %d is %d.\n",ss,sum[index-1]);
else printf("Closest sum to %d is %d.\n",ss,sum[index]);
}
}
cas++;
}
return 0;
}
UVA 10487 最接近的和
最新推荐文章于 2019-02-13 22:00:09 发布