/*
暴力 O(m*n*n) (排序+剪枝)
*/
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAXN = 1005;
const int INF = (unsigned int)(1<<31)-1;
int A[MAXN];
int n;
void solve(int num)
{
int closest = INF;
int gap = INF;
for(int i=0; i<n-1; i++) {
for(int j=i+1; j<n; j++) {
int s = A[i]+A[j]-num;
if(abs(s) < gap) {
closest = A[i] + A[j];
gap = abs(s);
}
if(s>0) break;
}
if(A[i] > num) break;
}
printf("Closest sum to %d is %d.\n", num, closest);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int T=0;
while(scanf("%d", &n) && n) {
for(int i=0; i<n; i++) {
scanf("%d", &A[i]);
}
sort(A, A+n);
printf("Case %d:\n", ++T);
int m, num;
scanf("%d", &m);
for(int i=0; i<m; i++) {
scanf("%d", &num);
solve(num);
}
}
return 0;
}
UVa 10487 - Closest Sums
最新推荐文章于 2017-04-25 14:42:00 发布