AtCoder Grand Contest 034 に参加して

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/));
コンテスト結果
緑コーダーになった!
