SRM455 DIV2

rate80ぐらい落ちた

250 - SpidersOnTheGrid

クモ好きな少年が盤の上にクモを敷き詰めました。うげぇ
そのクモはWESNで指定した方角に1秒で1マス動くから、1秒後にクモがいないマスの数を返してねって問題。
盤からはみ出したクモは落ちる。


(x,y)がWだったら(x-1,y)に1足す、ってやっていけばいいよね。
解き方はすぐ思いついたけれど、WとEの方向を間違えたり(!)breakつけ忘れてたり
はみ出してるかいちいち確認しなくていいように最初から盤を大きく取る方法を使おうとして混乱したり
変なところで時間食って30分くらいかかった。ひどい。

public class SpidersOnTheGrid {
    public int find(String[] A) {
        int res = 0;
        int[][] t = new int[A.length][A[0].length()];

        for(int i=0; i<A.length; i++){
            for(int j=0; j<A[i].length(); j++){
                char c = A[i].charAt(j);
                switch(c){
                    case 'W': if(j-1>=0) t[i][j-1] += 1; break;
                    case 'E': if(j+1<A[i].length()) t[i][j+1] += 1;break;
                    case 'S': if(i+1<A.length) t[i+1][j] += 1;break;
                    case 'N': if(i-1>=0) t[i-1][j] += 1;break;
                }
            }
        }
        for(int i=0; i<t.length; i++){
            for(int j=0; j<t[0].length; j++){
                if(t[i][j]==0) res += 1;
            }
        }
        return res;
    }
}

500 - EasySequence

数列A,Bが与えられる。
与えられた数列AをA[0], A[1], ... ,A[N-1]とおくと、
Aのi番目(i>=N)の値は、A[i]=(A[i-1]+A[i-2]+...+A[i-N])%10となる。
このとき数列A内に数列Bが現れるなら、Bが出てくる最初のindexを返して、含まれないなら-1を返せよな!っていう問題。
日本語難しい


System Testで爆死。

public class EasySequence {
    public int find(int[] A, int[] B) {
        int[] t = new int[100000];
        for(int i=0; i<A.length; i++){
            t[i] = A[i];
        }
        int len = A.length;
        boolean b = false;
        int test = 0;
        for (int j=A.length; j<t.length; j++) {
            for (int i = 1; i <= len; i++) {
                t[j] += t[j-i];
            }
            t[j] = t[j]%10;
            if (!b) {
                if (t[j-len] == B[0]) {
                    if(B.length==1) return j-len;
                    b = true;
                    test = 1;
                }
            } else {
                if(t[j-len] == B[test]){
                    if(test>=B.length-1) return j-len-test;
                    test++;
                } else {
                    b = false;
                    test = 0;
                }
            }
        }
        return -1;
    }
}
if(B.length==1) return j-len;

submit時は↑が抜けててBの要素数が1のときアウトだった。
付け足して再度System Testしてみると1つだけ通らない。
他の似たようなケースは通ってるのに謎。
文字列にしてindexOfを使ってる人がほとんどだったのであとで直す。って書いて後で直した試しがない。↓なおした


しかし、%10つまり必ず1文字、マッチする最初のindexを返す、ってどう考えても文字列にしてindexOf使えよほーらほらってことですやん
こんだけエサぶらさげられてるのに気付かなかったのがくやしいっ・・・!!

追記
public class EasySequence2 {
    public int find(int[] A, int[] B) {
        char[] t = new char[100000];
        for(int i=0; i<t.length; i++){
            if(i<A.length) {
                t[i] = (char)A[i];
                continue;
            }
            int a=0;
            for(int j=1; j<=A.length; j++){
                a += t[i-j];
            }
            t[i] = (char)(a%10);
        }
        String s = new String(t);
        String m = "";
        for(int i : B){
            m += (char)i;
        }
        return s.indexOf(m);
    }
}

すっきり!!!!

1000

2時間くらい粘ってあきらめた。わたしのあたまではりかいふのうでっす