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に回復し、緑色コーダーに復帰。