結果
問題 | No.102 トランプを奪え |
ユーザー |
|
提出日時 | 2015-08-20 13:03:24 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 191 ms / 5,000 ms |
コード長 | 1,352 bytes |
コンパイル時間 | 1,570 ms |
コンパイル使用メモリ | 176,144 KB |
実行使用メモリ | 8,960 KB |
最終ジャッジ日時 | 2024-07-18 10:50:29 |
合計ジャッジ時間 | 2,614 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 8 |
ソースコード
#include <bits/stdc++.h> #define rep(i, a) for (int i = 0; i < (a); i++) #define rep2(i, a, b) for (int i = (a); i < (b); i++) #define repr(i, a) for (int i = (a) - 1; i >= 0; i--) #define repr2(i, a, b) for (int i = (b) - 1; i >= (a); i--) using namespace std; typedef long long ll; const ll inf = 1e9; const ll mod = 1e9 + 9; typedef pair<int, int> P; map<pair<P, vector<int>>, P> dp; P dfs(P score, vector<int> N) { sort(N.begin(), N.end()); auto key = make_pair(score, N); if (dp.count(key)) return dp[key]; swap(score.first, score.second); if (all_of(N.begin(), N.end(), [](int x) { return x == 0; })) { return score; } P res(-1, inf); rep (j, 4) { rep2 (k, 1, min(4, N[j] + 1)) { N[j] -= k; P p; if (k < N[j]) { p = dfs(P(score.first + k, score.second), N); } else { p = dfs(P(score.first + (score.second + 1) / 2 + k, score.second / 2), N); } swap(p.first, p.second); if (res.first < p.first) { res = p; } else if (res.first == p.first && res.second > p.second) { res = p; } N[j] += k; } } return dp[key] = res; } int main() { vector<int> N(4); rep (i, 4) cin >> N[i]; auto ans = dfs(P(0, 0), N); if (ans.first > ans.second) { cout << "Taro" << endl; } else if (ans.first == ans.second) { cout << "Draw" << endl; } else { cout << "Jiro" << endl; } return 0; }