UVa OJ 12233

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
using namespace std;

const int MAXTIME = 12;
const int INF = 100000000;
const string name[] = {"Y", "H", "L", "M"};

int SY_jing, XX_su, SY_su, yurun_jing, yurun_shen, shuerguo_shen;
int maxjing[4], maxshen[4], su[4];
int d1x[4], d2x[4], d1s[4], d2s[4];
int wad[4], ssd[4], ssq[4], ssp[4], q1[4], q2[4];
int jing[4], qi[4], shen[4];

int MaxT, Hero, Pos, HeroT, XXT, SYT;
map<int,int> hash[MAXTIME + 1];
int dfs(int t, int j, int q, int s) {
  if(j <= 0) return -INF;
  if(t > MaxT) return 0;
  j = min(j, maxjing[Hero]); q = min(q, 100); s = min(s, maxshen[Hero]);
  int h = j*110000 + q*1000 + s;
  if(hash[t].count(h)) return hash[t][h];
  int dj = 0, dq = 0;
  if(t % XXT == 0) {
    if((t / XXT) % 4 == Pos) { dj -= d1x[Hero]; dq += q2[Hero]; }
    if((t / XXT) % 4 == 0) dj -= d2x[Hero];
  }
  if(t % SYT == 0) {
    if((t / SYT) % 4 == Pos) { dj -= d1s[Hero]; dq += q2[Hero]; }
    if((t / SYT) % 4 == 0) dj -= d2s[Hero];
  }
  hash[t][h] = -INF;
  int& ans = hash[t][h];
  if(t == MaxT) {
    ans = 0;
    if (t % HeroT != 0) return 0;
    if(j > wad[Hero]) ans = max(ans, wad[Hero]);
    if(q >= ssq[Hero]) {
      int dj2 = (ssp[Hero] == 1 ? -ssd[Hero] : 0);
      if(j+dj2 > 0) ans = max(ans, ssd[Hero]);
    }
  } else {
    if (t % HeroT != 0) return ans = dfs(t+1, j+dj, q+dq, s);
    ans = max(ans, dfs(t+1, j+dj, q+dq+q1[Hero], s));
    ans = max(ans, dfs(t+1, j+dj-wad[Hero], q+dq+q1[Hero], s) + wad[Hero]);
    if(s >= yurun_shen && j < maxjing[Hero]) ans = max(ans, dfs(t+1, min(j+yurun_jing, maxjing[Hero])+dj, q+dq, s-yurun_shen));
    if(s < maxshen[Hero]) ans = max(ans, dfs(t+1, j+dj, q+dq, s+shuerguo_shen));
    if(q >= ssq[Hero]) {
      int dj2 = (ssp[Hero] == 1 ? -ssd[Hero] : 0);
      ans = max(ans, dfs(t+1, j+dj+dj2, q+dq-ssq[Hero], s) + ssd[Hero]);
    }
  }
  return ans;
}

int d[4][4];
vector<string> ans;
int solve(int maxt) {
  for(int h = 0; h < 4; h++)
    for(int p = 1; p <= 3; p++) {
      MaxT = maxt; Hero = h; Pos = p; HeroT = 5 - su[h];
      for(int t = 1; t <= maxt; t++) hash[t].clear();
      d[h][p] = dfs(1, jing[h], qi[h], shen[h]);
    }
  ans.clear();
  for(int h1 = 0; h1 < 4; h1++)
    for(int h2 = 0; h2 < 4; h2++) if(h2 != h1)
      for(int h3 = 0; h3 < 4; h3++) if(h3 != h1 && h3 != h2)
        if(d[h1][1] + d[h2][2] + d[h3][3] >= SY_jing)
          ans.push_back(name[h1] + name[h2] + name[h3]);
  sort(ans.begin(), ans.end());
  return ans.size();
}

int main() {
  int caseno = 0;
    while(cin >> SY_jing && SY_jing) {
    cin >> XX_su >> SY_su >> yurun_jing >> yurun_shen >> shuerguo_shen;
    for(int i = 0; i < 4; i++)
      cin >> maxjing[i] >> maxshen[i] >> su[i] >> d1x[i] >> d2x[i] >> d1s[i] >> d2s[i] >> wad[i] >> ssd[i] >> ssq[i] >> ssp[i] >> q1[i] >> q2[i] >> jing[i] >> qi[i] >> shen[i];
    XXT = 5 - XX_su; SYT = 5 - SY_su;
    cout << "Case " << ++caseno << ": ";
    for(int i = 1; i <= MAXTIME; i++) if(solve(i)) {
      cout << i;
      for(int j = 0; j < ans.size(); j++) cout << " " << ans[j];
      break;
    }
    if(ans.size() == 0) cout << -1;
    cout << endl << endl;
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值