// 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