TopCoder SRM 498

6回目のSRM参戦。

Div2 Easy: AdditionGame(Java

はいはい。スピード勝負。

public class AdditionGame {

	public int getMaximumPoints(int A, int B, int C, int N) {
		int res = 0;
		for (int i = 0; i < N; i++) {
			int max = Math.max(Math.max(A, B), C);
			if (max >= 1) {
				res += max;
				if (max == A) A--;
				else if (max == B) B--;
				else if (max == C) C--;
			}
		}
		return res;
	}
	
}

switch/case文を使おうとしたら定数じゃないとダメって怒られた。ふだん使わないから知らんかった。(Pythonにはswitch/case文がない)

Div2 Medium: FoxSequence(Java

最初C#で書きかけてJavaで書き直すというアホなことをしてしまった。。。
比較的素直に書いていけばよさそうな問題ですが・・・

public class FoxSequence {

	public String isValid(int[] seq) {
		int diff = seq[1] - seq[0];
		if (diff <= 0) return "NO";
		int status = 1;
		for (int i = 2; i < seq.length; i++) {
			int newdiff = seq[i] - seq[i-1];
			if (status == 1 || status == 4) {
				if (newdiff <= 0) {
					status++;
				} else if (newdiff != diff) {
					return "NO";
				}
			} else if (status == 2 || status == 5) {
				if (newdiff >= 0) {
					status++;
					if (status == 3 && newdiff != 0) {
						status++;
					}
				} else if (newdiff != diff) {
					return "NO";
				}
			} else if (status == 3) {
				if (newdiff != 0) {
					status++;
				}
			}
			diff = newdiff;
		}
		if (status != 5) return "NO";
		return "YES";
	}
	
}

おそるおそる提出したところ、不安が的中してChallenge Phaseで被撃墜。

int seq = {1, 2, 2, 2, 3, 2};

のようなケースで落ちます。
条件式のミス。

追記: 他にも {1} や {1, 2, 3, 4, 5, 4, 3, 3, 3, 2, 1} の時がだめです。一行修正・二行追加。

Div2 Hard: NinePuzzle(Java

めずらしく時間が余ったのでだめもとでHard問題にもチャレンジ。
んー、これって入れ替えとか考える必要あるのかなー?
こんな簡単なわけないから間違ってるだろうけど、一応出してみるか・・・。

public class NinePuzzle {

	public int getMinimumCost(String init, String goal) {
		int res = 0;
		char[] colors = {'R', 'G', 'B', 'Y'};
		for (char color : colors) {
			int initnum = 0;
			int goalnum = 0;
			for (int i = 0; i < init.length(); i++) {
				if (init.charAt(i) == color) initnum++;
				if (goal.charAt(i) == color) goalnum++;
			}
			res += Math.abs(initnum - goalnum);
		}
		return res / 2;
	}
	
}

なんと正解。746.08ptゲット!

結果

977.65ptで179位。
レーティングは859から947に回復し、緑色コーダーに復帰。