いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

Topcoder SRM 569 div2

期末テストで参加できず。
プラクティスルームでといてみた。

結果
easy : 228.03
med : 440.11

hardとかチャレンジはしてない。出てれば42位くらいだったっぽい。
青になりたかったなぁ。

easy
students.size()は50なので、全探索すればいい。

class TheJediTestDiv2 {
    public:
        int countSupervisors(vector <int> students, int Y, int J) {
            int N = students.size();
            //which yoda choose
            int minc = 1000000000;
            rep(i,N){
                int cnt = 0;
                rep(j,N){
                    if(i==j){
                        int rest = students[j] - Y;
                        cnt += max(0,(int)ceil(1.0*rest / J));
                    }else{
                        cnt += ceil(1.0*students[j] / J);
                    }
                }
                minc = min(minc,cnt);
            }
            return minc;
        }
};

med
ANDやOR,XORの表を書いて少し考えると、ある列に関して、1が二つ以上、0が一つ以上あれば十分であることがわかる。

class TheDeviceDiv2 {
    public:
        string identify(vector <string> plates) {
            int M = plates[0].size();
            int N = plates.size();
            bool ok = true;
            for(int i = 0;i<M;i++){
                int one_cnt = 0,zero_cnt = 0;
                for(int j=0;j<N;j++){
                    if(plates[j][i] == '1') one_cnt++;
                    else zero_cnt++;
                }
                if(one_cnt >= 2 and zero_cnt >= 1){
                }else{
                    ok = false;
                }
            }
            if(ok) return "YES";
            else return "NO";
        }
};

反省としては、もう少しはやくeasyを解けるべきだった。
やっぱ一文字変数やめなきゃだめかも。
medがこれくらいの速度で解けたのは割と満足かも。