Advertisement
Guest User

Untitled

a guest
Sep 20th, 2014
1,270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <string>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. typedef pair <int, int> ii;
  8.  
  9. const int Maxs = 10;
  10. const int Maxt = 13;
  11. const int Maxn = 11;
  12. const int Maxm = 6;
  13.  
  14. int t;
  15. ii S[2 * Maxs];
  16. int win[Maxt][Maxn][Maxm][Maxm][Maxn][Maxm][Maxm];
  17. int par[Maxt][Maxn][Maxm][Maxm][Maxn][Maxm][Maxm];
  18.  
  19. ii Better(ii a, ii b)
  20. {
  21.     if (a.first != b.first) return a.first > b.first? a: b;
  22.     if (a.first == -1) return a.second > b.second? a: b;
  23.     return a.second < b.second? a: b;
  24. }
  25.  
  26. ii getRes(int a, int b, int turn, int hp1, int atk1, int def1, int hp2, int atk2, int def2)
  27. {
  28.     if (hp1 <= 0) return ii(-1, turn - 1);
  29.     if (turn >= Maxt) return ii(1, turn);
  30.     if (!win[turn][hp1][atk1][def1][hp2][atk2][def2]) {
  31.         ii res = ii(-1, 0), got;
  32.         int lim = 4 + (turn + 1) / 2;
  33.         for (int i = a; i < a + lim; i++) {
  34.             if (S[i].first == 0) got = getRes(b, a, turn + 1, hp2, atk2, def2, min(10, hp1 + S[i].second), atk1, def1);
  35.             else if (S[i].first == 1) got = getRes(b, a, turn + 1, hp2, atk2, def2, hp1, max(atk1, S[i].second), def1);
  36.             else if (S[i].first == 2) got = getRes(b, a, turn + 1, hp2, atk2, def2, hp1, atk1, max(def1, S[i].second));
  37.             else got = getRes(b, a, turn + 1, hp2 - max(0, atk1 - def2), atk2, def2, hp1, atk1, def1);
  38.             got.first = -got.first;
  39.             res = Better(res, got);
  40.         }
  41.         win[turn][hp1][atk1][def1][hp2][atk2][def2] = res.first;
  42.         par[turn][hp1][atk1][def1][hp2][atk2][def2] = res.second;
  43.     }
  44.     return ii(win[turn][hp1][atk1][def1][hp2][atk2][def2], par[turn][hp1][atk1][def1][hp2][atk2][def2]);
  45. }
  46.  
  47. ii getRes()
  48. {
  49.     fill((int*)win, (int*)win + Maxt * Maxn * Maxm * Maxm * Maxn * Maxm * Maxm, 0);
  50.     return getRes(0, Maxs, 1, 10, 0, 0, 10, 0, 0);
  51. }
  52.  
  53. int main()
  54. {
  55.     scanf("%d", &t);
  56.     for (int tc = 1; tc <= t; tc++) {
  57.         for (int i = 0; i < 2 * Maxs; i++) {
  58.             string card; int pw; cin >> card;
  59.             if (card != "HIT!") scanf("%d", &pw);
  60.             if (card == "Heal") S[i] = ii(0, pw);
  61.             else if (card == "Atk") S[i] = ii(1, pw);
  62.             else if (card == "Def") S[i] = ii(2, pw);
  63.             else S[i] = ii(3, 0);
  64.         }
  65.         ii res = getRes();
  66.         printf("Case #%d: %s %d\n", tc, res.first == 1? "win": "lose", res.second);
  67.     }
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement