SRM 421 Div2 Easy GymTraining

問題

ジムでneedToTrain分だけトレーニングをする.1分間トレーニングをすると心拍数がtrainChangeだけ増加,逆に1分間休むと心拍数がrestChangeだけ減少.但し心拍数はminPulseを下回らない.初期状態がminPulseで心拍数をmaxPulseよりも超えさせたくない時needToTrain分のトレーニングが完了する時間を返せ.もしトレーニングが完了しない場合は-1を返す.

解答

maxPulse-minPulse < trainChangeの時,トレーニングが全く出来ないので-1を返す.逆を言えば,そうではない場合,トレーニング,minPulseまで休憩,再度トレーニングと,着実にトレーニングを行うことが出来る.後はmaxPulseを超えないように出来るだけトレーニングをし,超えるようなら休むようにシミュレーションしてやれば良い.

class GymTraining
{
public:
  int trainingTime(int needToTrain, int minPulse, int maxPulse, int trainChange, int restChange)
    {
      int i;
      int tm = 0;
      int rm = 0;
      int cur = minPulse;
      if ((maxPulse-minPulse) < trainChange) return -1;
      while(tm < needToTrain){
        if (cur + trainChange <= maxPulse){
          cur += trainChange;
          tm++;
        }else{
          cur = max(cur - restChange, minPulse);
          rm++;
        }
      }
      return tm+rm;
    }
};