Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <string>
- #include <algorithm>
- using namespace std;
- typedef pair <int, int> ii;
- const int Maxs = 10;
- const int Maxt = 13;
- const int Maxn = 11;
- const int Maxm = 6;
- int t;
- ii S[2 * Maxs];
- int win[Maxt][Maxn][Maxm][Maxm][Maxn][Maxm][Maxm];
- int par[Maxt][Maxn][Maxm][Maxm][Maxn][Maxm][Maxm];
- ii Better(ii a, ii b)
- {
- if (a.first != b.first) return a.first > b.first? a: b;
- if (a.first == -1) return a.second > b.second? a: b;
- return a.second < b.second? a: b;
- }
- ii getRes(int a, int b, int turn, int hp1, int atk1, int def1, int hp2, int atk2, int def2)
- {
- if (hp1 <= 0) return ii(-1, turn - 1);
- if (turn >= Maxt) return ii(1, turn);
- if (!win[turn][hp1][atk1][def1][hp2][atk2][def2]) {
- ii res = ii(-1, 0), got;
- int lim = 4 + (turn + 1) / 2;
- for (int i = a; i < a + lim; i++) {
- if (S[i].first == 0) got = getRes(b, a, turn + 1, hp2, atk2, def2, min(10, hp1 + S[i].second), atk1, def1);
- else if (S[i].first == 1) got = getRes(b, a, turn + 1, hp2, atk2, def2, hp1, max(atk1, S[i].second), def1);
- else if (S[i].first == 2) got = getRes(b, a, turn + 1, hp2, atk2, def2, hp1, atk1, max(def1, S[i].second));
- else got = getRes(b, a, turn + 1, hp2 - max(0, atk1 - def2), atk2, def2, hp1, atk1, def1);
- got.first = -got.first;
- res = Better(res, got);
- }
- win[turn][hp1][atk1][def1][hp2][atk2][def2] = res.first;
- par[turn][hp1][atk1][def1][hp2][atk2][def2] = res.second;
- }
- return ii(win[turn][hp1][atk1][def1][hp2][atk2][def2], par[turn][hp1][atk1][def1][hp2][atk2][def2]);
- }
- ii getRes()
- {
- fill((int*)win, (int*)win + Maxt * Maxn * Maxm * Maxm * Maxn * Maxm * Maxm, 0);
- return getRes(0, Maxs, 1, 10, 0, 0, 10, 0, 0);
- }
- int main()
- {
- scanf("%d", &t);
- for (int tc = 1; tc <= t; tc++) {
- for (int i = 0; i < 2 * Maxs; i++) {
- string card; int pw; cin >> card;
- if (card != "HIT!") scanf("%d", &pw);
- if (card == "Heal") S[i] = ii(0, pw);
- else if (card == "Atk") S[i] = ii(1, pw);
- else if (card == "Def") S[i] = ii(2, pw);
- else S[i] = ii(3, 0);
- }
- ii res = getRes();
- printf("Case #%d: %s %d\n", tc, res.first == 1? "win": "lose", res.second);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement