Aizu Online Judge 0529 - Darts
解法
ダーツを使わないことを点数0を得ることと考えれば, 半分全列挙でとけます.
ソースコード
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> pi; vector<int> comb; int main() { int N, M; while (cin >> N >> M, N | M) { pi = vector<int>(N + 1); comb = vector<int>((N + 1) * (N + 1)); for (int i = 0; i < N; i++) { cin >> pi[i]; } pi[N] = 0; for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { comb[i * (N + 1) + j] = pi[i] + pi[j]; } } sort(comb.begin(), comb.end()); int ans = 0; for (int i = 0; i < N + 1; i++) { for (int j = 0; j < N + 1; j++) { int fscore = pi[i] + pi[j]; if (fscore <= M) { int idx = lower_bound(comb.begin(), comb.end(), M - fscore) - comb.begin(), lscore; if (idx >= comb.size() || comb[idx] != M - fscore) lscore = comb[idx - 1]; else lscore = comb[idx]; ans = max(ans, fscore + lscore); } } } cout << ans << endl; } return 0; }
感想
時間かかりすぎですが, 解けてよかったです.