Hatena::Grouptopcoder

blue_jamのTopCoder日記

 | 

2011-09-01

SRM501 Div1 Easy 練習

| 11:59

概要

Cielが暇つぶしに以下の一人遊びをする.

  1. 実数scoreA, scoreB,正整数nA,nBが与えられる.
  2. scoreが0の状態から始め,scoreAをnA回scoreに足し,scoreBをnB回scoreにかける.(順番は問わない)
  3. scoreを最大いくらにすることができるか.

解法

条件分岐やるだけ.powなどのメソッドを使うとループ使わずに解ける.

scoreにnA * scoreAを加える.

  • 0.0 <= score かつ scoreB >= 1.0の時は,scoreB^nBをscoreにかける.
  • 0.0 <= scoreB <= 1.0のとき
    • 0.0 > score ならscoreB^nBをscoreにかける.
  • -1.0 <= scoreB < 0.0の時
    • 0.0 > score ならscoreBをscoreにかける.(ここを1回間違えた)
  • -1.0 >= scoreB の時
    • score < 0.0ならnB以下の最大の奇数を求め,その数だけscoreにかける.(ここでnB=0の時の例外で引っかかる)
    • score >= 0.0ならnB以下の最大の偶数を求め,その数だけscoreにかける.

ソースコード

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

		if(scoreB >= 1.0){
			if(res >= 0.0){
				res = res * pow(scoreB, (double)nB);
			}
		}
		else if(scoreB >= 0.0){
			if(res <= 0.0){
				res = res * pow(scoreB, (double)nB);
			}
		}
		else if(scoreB > -1.0){
			if(res < 0.0){
				if(nB >= 1)
					res = res * scoreB;
			}
		}
		else{
			if(res >= 0.0){
				nB = nB / 2 * 2;
			}
			else{
				if(nB > 0 && nB % 2 == 0){
					nB = nB - 1;
				}
			}
			res = res * pow(scoreB, (double)nB);
		}
        return res;
    }

};

トータル2回ミスで125.01点.本番だと論外.

コーナーケースだけならまだしも,条件の判断ミスがあるのはだめすぎる.

 |