SRM534 DIV2
一応システムテスト済み。
致命的なミスがあるかもしれません・・・
250 point
入力:ファイルリスト {".","..","ContenstApplet.jnlp",...} みたいなかんじ
出力:"."と".."が最後の2つになっているようなファイルリスト。
条件:末尾でない場所に"."か".."があったら、末尾に追加するようにswap。
注意:swapする際に末尾が"."か".."があってもかならず末尾に挿入
public class EllysDirectoryListing { public String[] getFiles (String[] files) { int last = files.length -1; for (int i=0;i<files.length-2;i++) { if (files[i].equals(".") || files[i].equals("..")) { if (files[last].equals(".") || files[last].equals("..")) { String swp = files[last]; files[last] = files[last-1]; files[last-1] = swp; } String swp = files[i]; files[i] = files[last]; files[last] = swp; last--; } } return files; } }
500 point
入力:右から順に.かoのString, ".o.." みたいなかんじ
出力:初めのプレーヤーがゲームに勝てるかどうか
条件:2人が交互にプレイして、oを右に動かす。動かせなくなったほうが負け。右に1つ動かすか、右に3つジャンプして動かすかを選択できる。ただし一番はじにoが移動したらその場でそのoは消える。
注意:右に1つ動かすのを3回するのと、右に3動かすのを行うのは等価。
考え方:
移動にかかる最短の手数を考える。
...ooooooooo
...432321210
といった具合に、右からの位置pに対して移動量はp/3+p%3。
すべての石に対して移動量を加算して、その和が奇数であれば初手の勝ち。
public class EllysCheckers { public String getWinner (String board) { int sum = 0; for (int i=0;i<board.length();i++) { if (board.charAt(i)=='o') { int p = board.length() -1 - i; sum += p/3 + p%3; } } if (sum%2==1) return "YES"; return "NO"; } }