ほねっとのぶろぐ

アニメとAndroidが好きなほねっとのブログです。

AtCoder Beginner Contest 128 に参加して

f:id:aftercider:20190428202214p:plain

AtCoder Beginner Contest 128(略称ABC128)に参加しました。

atcoder.jp

ABC128

今回も安定の20分おくれで遅刻スタート。結果はABCの3完でした。

A問題

書くだけ。

B問題

ソート順の設定と、ソート後のインデックスの保持だったので、これも書くだけ。

function Main(input) {
    var result;
    const N = parseInt(input.shift());
    const SP = [];
    for (var i = 0; i < N; i++) {
        SP.push({
            I: i + 1,
            S: input[i * 2],
            P: parseInt(input[i * 2 + 1])
        })
    }

    SP.sort((a, b) => {
        var stComp = a.S.localeCompare(b.S);
        if (stComp == 0) {
            return b.P - a.P;
        }
        return stComp;
    })
    SP.forEach(value => console.log(value.I));
}

Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n|\s/));

C問題

条件結構絞ってあるので、全探索いけそうと思って取り組んだけども、バリエーション作る関数が思ったより作るの大変だった。。。

あと、毎回やってしまうところで、インデックスを1スタートとすべきところを0のままやってしまい、タイムロス。。。

function Main(input) {
    var result;
    const N = parseInt(input[0].split(/\s/)[0]);
    const M = parseInt(input.shift().split(/\s/)[1]);
    const KS = input.slice(0, M).map(value => value.split(/\s/).map(v => parseInt(v)));
    const P = input.slice(M)[0].split(/\s/);

    var count = 0;
    generateMap(N).forEach(SW => check(SW, KS, P) == true ? count++ : 0);
    console.log(count);
}

function generateMap(N) {
    var arr = [];
    for (var index = 0; index < Math.pow(2, N); index++) {
        var value = index;
        var insert = [];
        for (var i = 0; i < N; i++) {
            insert.push(value % 2);
            value = Math.floor(value / 2);
        }
        arr.push(insert);
    }
    return arr;
}

function check(sw, KS, P) {
    for (var index = 0; index < KS.length; index++) {
        var ks = KS[index];
        var check = 0;
        for (var i = 1; i < ks.length; i++) {
            var s = ks[i] - 1;
            if (sw[s] == 1) check++;
        }

        if (P[index] == "1") check++;
        if (check % 2 > 0) return false;
    };
    return true;
}

Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n/));

D問題

大体の方針は立ったので、あとは実装するだけだとなったけど、スムーズに実装ができず、時間切れ。

定番の関数をストックしておくといいのかな・・・

解答見たら、方針はあっていたのでその点はよかった。

感想

今回のコンテストでとりあえず茶色コーダーになった。

コンテストの問題も難しいけど、一番難しいのはコンテスト開催の時間にPCの前にいることだな・・・

毎度思うことだけど、コンテストで使うNodeJSのバージョンを今のv5.12からv10あたりまで上げてほしい。。。