結果
問題 | No.158 奇妙なお使い |
ユーザー | kimiyuki |
提出日時 | 2016-09-27 22:35:08 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,846 bytes |
コンパイル時間 | 1,128 ms |
コンパイル使用メモリ | 96,808 KB |
実行使用メモリ | 47,468 KB |
最終ジャッジ日時 | 2024-11-21 07:27:20 |
合計ジャッジ時間 | 11,443 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 4 ms
6,816 KB |
testcase_01 | AC | 44 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,816 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | TLE | - |
testcase_05 | AC | 2 ms
6,816 KB |
testcase_06 | AC | 2 ms
6,820 KB |
testcase_07 | AC | 1 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,816 KB |
testcase_09 | AC | 5 ms
6,820 KB |
testcase_10 | AC | 6 ms
6,820 KB |
testcase_11 | AC | 5 ms
6,816 KB |
testcase_12 | AC | 3 ms
6,816 KB |
testcase_13 | AC | 2 ms
6,816 KB |
testcase_14 | AC | 27 ms
6,816 KB |
testcase_15 | AC | 166 ms
6,820 KB |
testcase_16 | AC | 202 ms
6,820 KB |
testcase_17 | AC | 1,103 ms
12,416 KB |
testcase_18 | AC | 167 ms
7,552 KB |
testcase_19 | AC | 4 ms
6,820 KB |
testcase_20 | AC | 44 ms
6,820 KB |
testcase_21 | AC | 10 ms
6,820 KB |
testcase_22 | AC | 10 ms
6,820 KB |
testcase_23 | AC | 13 ms
6,820 KB |
testcase_24 | AC | 8 ms
6,820 KB |
testcase_25 | AC | 2 ms
6,820 KB |
testcase_26 | AC | 40 ms
6,816 KB |
testcase_27 | AC | 2 ms
6,820 KB |
testcase_28 | AC | 580 ms
7,680 KB |
testcase_29 | AC | 3 ms
6,820 KB |
testcase_30 | AC | 921 ms
47,468 KB |
ソースコード
#pragma GCC optimize ("-O3") #include <iostream> #include <map> #include <queue> #define repeat(i,n) for (int i = 0; (i) < (n); ++(i)) using namespace std; template <class T> void setmax(T & a, T const & b) { if (a < b) a = b; } const int inf = 1e9+7; const int N0 = 1000; const int N1 = 100; const int N2 = 1; struct wallet_t { int n0, n1, n2; }; int sum(wallet_t const & a) { return N0*a.n0 + N1*a.n1 + N2*a.n2; } bool valid(wallet_t const & a) { return a.n0 >= 0 and a.n1 >= 0 and a.n2 >= 0; } wallet_t operator + (wallet_t const & a, wallet_t const & b) { return (wallet_t) { a.n0 + b.n0, a.n1 + b.n1, a.n2 + b.n2 }; } wallet_t operator - (wallet_t const & a, wallet_t const & b) { return (wallet_t) { a.n0 - b.n0, a.n1 - b.n1, a.n2 - b.n2 }; } bool operator < (wallet_t const & a, wallet_t const & b) { return make_tuple(sum(a), a.n0, a.n1, a.n2) < make_tuple(sum(b), b.n0, b.n1, b.n2); } istream & operator >> (istream & in, wallet_t & a) { return in >> a.n0 >> a.n1 >> a.n2; } int main() { wallet_t wa, wb, wc; int db, dc; cin >> wa >> db >> wb >> dc >> wc; int ans = - inf; map<wallet_t,int> dp; priority_queue<wallet_t> que; que.push(wa); while (not que.empty()) { wallet_t w = que.top(); que.pop(); setmax(ans, dp[w]); repeat (i0,w.n0+1) { repeat (i1,w.n1+1) { auto foo = [&](int d, wallet_t wd) { int i2 = (d - N0*i0 - N1*i1) / N2; if (0 <= i2 and i2 <= w.n2) { wallet_t nw = (w - ((wallet_t) { i0, i1, i2 })) + wd; if (not dp.count(nw)) que.push(nw); setmax(dp[nw], dp[w]+1); } }; foo(db, wb); foo(dc, wc); } } } cout << ans << endl; return 0; }