SRM450 DIV2

出るの忘れてたああああああ
とりあえず問題を解く

250 - StrangeComputer

あるビットに値をセットしようとすると、その場所含む右側全部のビットがその値にセットされる命令がある。
初期値は0で、引数で与えられたビット列と同じにするには何回その命令を実行すればいいか。

ビットが切り替わってる回数を返せばおkだった。

//194.57pt
public class StrangeComputer {
    public int setMemory(String mem) {
        int res = 0;
        char m = '0';
        for(int i=0; i<mem.length(); i++){
            if(mem.charAt(i)!=m){
                m = mem.charAt(i);
                res++;
            }
        }
        return res;
    }
}

500 - OrderedNim

順番つきの石取りゲーム。アリスとボブどっちが勝つか!さあはったはった!っていう問題。
ラスト1つ前の山をどう取るかだよなあ、と考えながら書いた。
最後の山をゼロにした時のbreakを付け忘れてて「なんで答えが全部逆なんだー!」とかやっていた。これはひどい

//SystemTestで死亡
public class OrderedNim {
    public String winner(int[] layout) {
        char turn = 'a';
        a:
        for(int i=0; i<layout.length; i++){
            int l = layout.length-1;
            while(true){
                if (l == 0) {
                    return "Alice";
                } else if (layout[i]>1 && l-i==1) {
                    layout[i] = 1;
                } else {
                    layout[i] = 0;
                    if(l==i) break a;
                }
                switch (turn) {
                    case 'a': {
                        turn++;
                        break;
                    }
                    case 'b': {
                        turn--;
                        break;
                    }
                }
                if(layout[i]==0) break;
            }
        }
        if(turn=='a'){
            return "Alice";
        }else {
            return "Bob";
        }
    }


高得点取ってる人のコードをみて回ってみるとえらいスマートでびっくりした。自分の番で2つ以上取れるなら、あとはなんぼでも調整可能だから勝てるってことでいいのかな。
そして自分のコードを見直す。こいつぁ穴だらけだぜ!最後の1つ前以外は必ず山の石全部取ってくれる、なんてはずがない。うぬぬ・・・
メニューのPracticeOptionからSystemTestできることに気付いてやってみたらやっぱりアウトでした。
あと最後のreturnは三項演算子でおk

1000 - EnemyTowers

分かんなかった。あとで復習する。