3
1

概要

こちらの問題をJavaScriptで解きました。

方針

最後に座る人が席数をオーバーするとき・しないときの場合分けをなるべくすっきり書きたい

  • 空席確認と座席の更新は配列のループではなくslicefillメソッドを使って一度に処理する
  • オーバーする場合は ①座り始め~席数 ②最初の席~座り終わり の2つの処理が必要
  • オーバーしない場合は座り終わりの席番号endを0にして(slice(0,0))、毎回①②両方の処理を通すことにする

回答

// 標準入力からの値取得省略

const [n, m] = lines[0].split(' ').map((num) => Number(num));
let cnt = 0;

// 座席を生成
const seats = new Array(n);
seats.fill(0);

for (let i=1; i<=m; i++){
    const [people, no] = lines[i].split(' ').map((num) => Number(num));
    let start = no - 1;
    let max = no + people - 1 <= n ?  no + people - 1 : n;        // 最大の席番号
    let end = no + people - 1 <= n ?  0 : no + people - 1 - n;    // 座り終わりの席番号

    // 空席確認
    if (seats.slice(start, max).includes(1)) continue;   // 座り始めから最大の席番号まで
    if (seats.slice(0, end).includes(1)) continue;       // 最初の席番号から座り終わりまで

    // 全て通過した場合座席を更新
    seats.fill(1, start, max);
    seats.fill(1, 0, end);

}

for (let i=0; i<n; i++){
    if (seats[i] == 1) cnt += 1;
}
console.log(cnt);
3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1