// UVa 10487 - Closest Sums
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
#include <math.h>
using namespace std;
#define integer signed long long
vector<integer> v;
int bsearch(int ini, int fin, integer q) {
if (ini == fin)
return ini;
int mid = (ini + fin) >> 1;
if (v[mid] < q)
return bsearch(mid + 1, fin, q);
else
return bsearch(ini, mid, q);
}
int main() {
int t = 0, n;
while ((cin >> n) && n) {
t++;
integer a[1000];
v.clear();
for (int i = 0; i < n; i++) {
cin >> a[i];
for (int j = 0; j < i; j++)
if (a[i] != a[j])
v.push_back(a[i] + a[j]);
}
sort(v.begin(), v.end());
int m;
printf("Case %d:\n", t);
for (cin >> m; m; m--) {
integer q;
cin >> q;
int p = bsearch(0, v.size() - 1, q);
int c = p;
while (c > 0 && v[c] == v[p])
c--;
int d = p;
while (d < v.size() - 1 && v[d] == v[p])
d++;
integer cc = abs(v[c] - q);
integer cd = abs(v[d] - q);
integer cp = abs(v[p] - q);
int sol;
if (cc < cd && cc < cp)
sol = c;
else if (cd < cp)
sol = d;
else
sol = p;
printf("Closest sum to %lld is %lld.\n", q, v[sol]);
}
}
return 0;
}
Friday, August 7, 2015
UVa 10487 - Closest Sums
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment