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