新・Bランクレベルアップメニュー 【シミュレーション 3】燃費
【シミュレーション 3】燃費 コード 1/2
reader.on('close', () => {
// 発進から X m の燃費は F_1, X m 走った後 の燃費は F_2
const X = Number(lines[0]);
const [F_1, F_2] = lines[1].split(' ').map(Number); // 燃費
const [L, N] = lines[2].split(' ').map(Number); // 全長 L m 走って N 回止まる
const S = [0, ...lines[3].split(' ').map(Number), L]; // 停車地点(0 m → L m )
// console.log(S);
let L_1 = 0; // 燃費が F_1 で走行した距離
for (let i = 0; i <= N; i++) {
L_1 += Math.min(S[i + 1] - S[i], X);
// 燃費が F_1 で走行する距離は 次の停車地点-今の停車地点と X の短い方
}
const L_2 = L - L_1; // 燃費が F_2 で走行した距離
const ans = L_1 * F_1 + L_2 * F_2;
console.log(ans);
});
配列 S には スタート地点と L m の地点も含んでいます。先に燃費が F_1 で走行した総距離を求めてから L_2 で走行した総距離を L – L_1 で算出。後はそれぞれ燃費 ✕走行距離 を足し合わせました。
【シミュレーション 3】燃費 コード 2/2 (C++実装例参照)
reader.on('close', () => {
const X = Number(lines[0]);
const [F_1, F_2] = lines[1].split(' ').map(Number);
const [L, N] = lines[2].split(' ').map(Number);
const S = [...lines[3].split(' ').map(Number), L];
let now = 0; // 現在地
let ans = 0; // 必要な燃料
for (let i = 0; i <= N; i++) {
if (X < S[i] - now) { // 発車から停車までの距離が X より長い場合
ans += F_1 * X + F_2 * ((S[i] - now) - X);
} else { // 発車から停車までの距離が X 以下の場合
ans += F_1 * (S[i] - now);
}
now = S[i]; // 現在地を更新
}
console.log(ans);
});
解説では出発から X m 移動するまでは 1 m あたり F_1 ml, それ以降は F_2 ml の燃料が必要なので B – A が X m 以下か否かで場合分けをすることで燃料を計算することができます。
となっていました。
コメント