SRM 520 Div2 Medium SRMCodingPhase

プログラミングコンテストの話,問題の最大点と,それを解くための時間が与えられる.
最大点と解いた時間から獲得できる得点を求めることができる.
ただし,luckと呼ばれる魔法のような技が使える.
luckの時間だけ解くことができる時間を1分まで落とすことができる.
問題が3つあるのでどのようにluckを振り分けるかは自由.
獲得できる最大点を求めよという問題.

3つの問題についてluckの振り分けをそれぞれ考えると割り振り方が100*100*100と思うかもしれないが,1つ目と2つ目の振り分けが決まった時点で残り全部を3つ目の問題に使えば良いので100*100通りになる.
制限時間が75分なので解く問題を選ばなければならない.
どの問題を解くか3!のパターン考え,後は75分で解けた場合の最大点を求めれば良い.

class SRMCodingPhase
{
public:
  int countScore(vector <int> points, vector <int> skills, int luck)
    {
      int i,j,k;
      int ret = 0;
      for(i = 0; i <= min(luck, skills[0]-1); i++){
        int time0 = skills[0]-i;
        int score0 = points[0] - 2*time0;
        for(j = 0; j <= min(luck -i, skills[1] - 1); j++){
          int time1 = skills[1]-j;
          int score1 = points[1] - 4*time1;
          int time2 = skills[2]-min(skills[2]-1, luck-i-j);
          int score2 = points[2] - 8*time2;
          // cout << "s0=" << score0 << " s1=" << score1 << " s2=" << score2 << endl;
          // cout << "t0=" << time0 << " t1=" << time1 << " t2=" << time2 << endl;
          for (k = 0; k < 8; k++){
            int total_score = 0;
            int total_time = 0;
            if ((k>>2) & 1){
              total_score += score0;
              total_time += time0;
            }
            if ((k>>1) & 1){
              total_score += score1;
              total_time += time1;
            }
            if (k & 1){
              total_score += score2;
              total_time += time2;
            }
            // cout << "totals=" << total_score << " totalt=" << total_time << endl;
            if (total_time <= 75) ret = max(ret, total_score);
          }
        }
      }
      return ret;
    }
};