https://paiza.jp/poh/ec-campaign に挑戦してみましたので,そのコードを載せておきます.
#include <iostream> #include <vector> #include <algorithm> template <class Iterator> inline int calc(Iterator const first, Iterator const last, int const value) { if (*(last - 1) + *(last - 2) <= value) { return *(last - 1) + *(last - 2); } Iterator upper = std::lower_bound(first + 1, last, value / 2); if (upper + 1 != last && *upper + *(upper + 1) == value) { return value; } int best_price = 0; for (Iterator lower = std::upper_bound(first, upper, value - *upper); lower != first && upper != last; lower = std::upper_bound(first, lower - 1, value - *upper)) { upper = std::upper_bound(upper + 1, last, value - *(lower - 1)); best_price = std::max(best_price, *(upper - 1) + *(lower - 1)); if (best_price == value) { break; } } return best_price; } int main() { std::cin.tie(0); std::ios::sync_with_stdio(false); int N, D; std::cin >> N >> D; std::vector<int> prices; prices.reserve(N); for (int i = 0; i < N; ++i) { int p; std::cin >> p; prices.push_back(p); } std::sort(prices.begin(), prices.end()); for (int i = 0; i < D; ++i) { int m; std::cin >> m; std::cout << calc(prices.begin(), prices.end(), m) << '\n'; } }
結果は http://paiza.jp/poh/ec-campaign/result/16051cf4bd6d13df012bc008d1fdad13 です.case3は0.13secでした.