ほねぶろぐ

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

AtCoder Grand Contest 034 に参加して

f:id:aftercider:20190428202214p:plain

AtCoder Grand Contest 034(略称AGC034)に参加しました。

いつもコンテストのタイミングにスタートできなかったんですが、今回は開幕と同時に参加!

結果はABの2完でした。

Cは…もう一歩って感じですね。

D以降はてんでだめでした。

A問題

「Aは瞬殺だぜ〜」と思ってましたが、今回はAGC。

実装自体はサクッとできたんですが、細かいif文の内容を逆にしちゃったりで、辛い思いをしました。。。(if(D < C)を逆に書いてた)

function Main(input) {
    var result;
    const N = parseInt(input.shift())
    const A = parseInt(input.shift())
    const B = parseInt(input.shift());
    const C = parseInt(input.shift())
    const D = parseInt(input.shift())
    const S = input[0];
    
    // 2連続があったらOUT
    const LastIndex = Math.max(C,D);
    var prevStone = false;
    for (var i = A - 1; i < LastIndex; i++) {
        var element = S.charAt(i);
        if(element === "#") {
            if(prevStone) {
                console.log("No");
                return;
            }
        }
        prevStone = element === "#";
    }
    
    // 追い越す必要があるとき
    if(D < C) {
        var spaceCount = 0;
        for (var i = B - 2; i < D + 1; i++) {
            var elem = S.charAt(i);
            if(elem === ".") {
                spaceCount++;
            } else {
                spaceCount = 0;
            }
            if(spaceCount == 3){
                console.log('Yes');
                return;
            }
        }
        console.log("No");
    } else {
        console.log("Yes");
    }
}

// 改行・空白で分割
Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n|\s/));

B問題

これは結構サクッと終わった。

if条件わけの漏れがあってWAもだしたけど、結果的には無事完了。

function Main(input) {
    const S = input[0];
    
    var currentA = 0;
    var sum = 0;
    var prevB = false;
    
    for (var index = 0; index < S.length; index++) {
        var element = S.charAt(index);
        if(element === "A") {
            if(prevB) {
                currentA = 0;
            }
            currentA++;
        }else if(element === "B") {
            if(prevB) { 
                currentA = 0;
            }
        } else {
            if(prevB) {
                sum += currentA;
            } else {
                currentA = 0;
            }
        }
        prevB = element === "B";
    }

    console.log(sum);
    
}

// 改行・空白で分割
Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n|\s/));

C問題

うーん、むずかしかった。

これ解けたら結構順位上だっただろうなぁ・・・

function Main(input) {
    const N = parseInt(input[0].split(/\s/)[0]);
    const X = parseInt(input.shift().split(/\s/)[1]);
    const BLU = [];
    input.forEach(element => {
        var sp = element.split(/\s/);
        var value = {
            B: parseInt(sp[0]),
            L: parseInt(sp[1]),
            U: parseInt(sp[2]),
        };
        value.MIN_POINT = value.B * value.L; // 最小優先度にした時の獲得ポイント
        value.MAX_DIV = (X - value.B) * value.U; // X時間勉強したら埋められる差
        BLU.push(value);
    });
    BLU.sort((a, b) => b.MAX_DIV - a.MAX_DIV); // 降順

    var enemySum = 0; // 全部最小優先度にした時の相手のポイント
    BLU.forEach(element => {
        enemySum += element.MIN_POINT;
    });

    var difference = enemySum;
    var learnTime = 0;
    var lastIndex = 0;
    for (var i = 0; i < N; i++) {
        var element = BLU[i];
        difference -= element.MAX_DIV + element.MIN_POINT;
        if (difference <= 0) {
            difference += element.MAX_DIV + element.MIN_POINT;
            // 超えたら元に戻してブレイク
            lastIndex = i;
            break;
        } else {
            learnTime += X;
        }
    }

    // 最後の調整
    var minLearnTime = Number.MAX_SAFE_INTEGER;
    for (var i = lastIndex; i < N; i++) {
        var element = BLU[i];
        minLearnTime = Math.min(minLearnTime, Math.ceil((difference - element.MIN_POINT) / element.U) + element.B);
    }
    learnTime += minLearnTime

    console.log(learnTime);
}

// 改行・空白で分割
Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n/));

コンテスト結果

f:id:aftercider:20190603183458p:plain Contest Result - AtCoder

緑コーダーになった!