SRM 501 Div2 Medium FoxPlayingGame

問題

ある操作AとBをそれぞれnA, nB回だけ必ずやる.Aの操作はscoreAを現在のscoreに足す.Bの操作はscoreBを現在のscoreにかける.score=0から始める時,求めることが出来る最大のスコアを計算する

解答

scoreはマイナスだったり,1以下だったりするので注意が必要.
各条件で最適な求め方が存在するので注意して条件を考えれば良い.

class FoxPlayingGame
{
public:
  double theMax(int nA, int nB, int paramA, int paramB)
    {
      
      double scoreA = paramA / 1000.0;
      double scoreB = paramB / 1000.0;

      bool Bplus = false;
      if (abs(scoreB) > 1) Bplus = true;

      if (abs(scoreB) > 1){
        double res = scoreA * nA;
        if (scoreA > 0){
          if (scoreB < 0 && (nB % 2 == 1)) nB--;
          for(int i = 0; i < nB; i++) res *= scoreB;
        }else {
          if (scoreB > 0) return res;
          if (scoreB < 0 && (nB % 2 == 0)) nB--;
          for(int i = 0; i < nB; i++) res *= scoreB;
        }
        return res;
      }else{
        double res = scoreA * nA;
        if (scoreA < 0 && scoreB <= 0 && nB > 0) {
          res *= scoreB;
        }else if (scoreA < 0 && scoreB > 0){
          for(int i = 0; i < nB; i++) res *= scoreB;
        }
        return res;

      }
    }
};

追記

キーとなるのが掛け算。
scoreBの大小、正負によって一部使わない(初期値の0にかける)などの操作があり得る。
反対に足し算はそういった操作を捨てる行為ができない。
掛け算を0からnB回した時に最もスコアの高いスコアを返せば良い。

class FoxPlayingGame
{
public:
  double theMax(int nA, int nB, int paramA, int paramB)
    {
			double res = (double)nA * paramA / 1000;
			double cur = res;
			for(int i = 0; i < nB; i++) {
				cur *= (double)paramB / 1000;
				res = max(res, cur);
			}
			return res;
    }
};