同時に 使われる 会議室の数
- 並べ替えと貪欲
- 問題 12
- ふつう
- 目安 31 分
会議室の
本番の
入力は
問題
ある
同じ
入力の形式
N
s_1 e_1
s_2 e_2
...
s_N e_N1 行目に
出力の形式
同じ
制約
- N は 1 以上 200000 以下です
- s_i と e_i は、
0 以上 1000000 以下の整数です - 開始は
終了より 前です (s_i は e_i より 小さいです)
入力と出力の例
例 1
9 時 (540 分) から
入力
4 540 600 570 660 600 630 615 720
出力
3
例 2
前の
入力
3 60 120 0 60 120 180
出力
1
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
開始の
Python
Python
import sys
data = sys.stdin.read().split()
n = int(data[0])
starts = sorted(map(int, data[1:1 + 2 * n:2]))
ends = sorted(map(int, data[2:2 + 2 * n:2]))
best = 0
j = 0
for k in range(n):
t = starts[k]
while ends[j] <= t:
j += 1
if k + 1 - j > best:
best = k + 1 - j
print(best)JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const n = data[0];
const starts = new Int32Array(n);
const ends = new Int32Array(n);
for (let i = 0; i < n; i++) {
starts[i] = data[1 + 2 * i];
ends[i] = data[2 + 2 * i];
}
starts.sort();
ends.sort();
let best = 0;
let j = 0;
for (let k = 0; k < n; k++) {
const t = starts[k];
while (ends[j] <= t) j++;
if (k + 1 - j > best) best = k + 1 - j;
}
console.log(best);計算量
時間は O(N log N) で、
よく ある間違い
- 終わる
時刻と 始まる 時刻が 同じ 2 件を、 重なっていると 数える。 終了の 時刻が t 以下の 予約は、 t には もう 使っていません ( <ではなく<=で数え 進めます) - 「ほかの
予約と 重なる 件数」の 最大を 答えに する。 予約 A が B とも C とも 重なっていても、 B と C が 重なっていなければ、 同時に 使われるのは 2 件です - 開始と
終了を 1 つの 並びに まとめて 並べ替える とき、 同じ 時刻の 開始と 終了の 順番を 決めずに 並べる。 同じ 時刻なら 終了を 先に 処理しないと、 重ならない 2 件を 重なったと数えます - JavaScript で
Arrayのsort()を引数なしで 呼ぶ。 数ではなく 文字として 並ぶので、 1000 が 600 より 前に 来ます。 普通の 配列なら sort((a, b) => a - b)と書きます (この 解答の Int32Arrayのsort()は数として 並びます)
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31