満員エレベーター (paizaランク B 相当)
解答例(C++の場合参考)
エレベーターをスタックと見なします。
rideでのw_1 w_2 ... w_Nをスプレッド構文[...w]に納めた。
get offはただpopをk回繰り返した。
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//乗り降りの回数 N とエレベーターの重量制限についての値 X
const [n, x] = lines[0].split(" ").map(Number);
let customer_sum = 0;//乗車人数
let kg_sum = 0;//合計体重
let elevator = [];//エレベーター、スタックで扱います。
//エレベーター乗り降り
for (let i = 1; i <= n; i++) {
const Q = lines[i].split(" ").map((v, i) => i === 0 ? v : Number(v));
if (Q[0] === "ride") {
const [_, N, ...w] = Q;
//エレベーターに乗る
for (let j = 0; j < N; j++) {
//重量制限以内
if (kg_sum + w[j] <= x) {
customer_sum++;
elevator.push(w[j]);
kg_sum += w[j];
}
}
} else {
//k人降りる
const [_, k] = Q;
for (let j = 0; j < k; j++) {
kg_sum -= elevator[elevator.length - 1];
elevator.pop();
}
customer_sum -= k;
}
}
console.log(customer_sum);
console.log(kg_sum);
customer_sumを無くして、代わりにelevator.lengthの出力でも大丈夫。
k人降りるところのfor内は、popの戻り値が末尾の値なので、以下のようにも書ける。
kg_sum -= elevator.pop();