以下に、TypeScript実装の各処理について、図を交えながらできる限り詳細に解析・解説します。
D日間の間に1日1仕事できる。- 各仕事
iはX[i]日目以降に開始可能で、報酬はY[i]円。 - 最大収益を得たい。
N = 5, D = 4
jobs = [
[1, 1], // 1日目以降:1円
[2, 4], // 2日目以降:4円
[2, 3], // 2日目以降:3円
[3, 4], // 3日目以降:4円
[4, 2], // 4日目以降:2円
]
日付をキーとする配列 jobByDay[1..D] を作る:
jobByDay = [
[], // 0 は未使用
[1], // 1日目に解禁される仕事
[4, 3], // 2日目に解禁
[4], // 3日目に解禁
[2], // 4日目に解禁
]
MaxHeap.push(3)
MaxHeap.push(5)
MaxHeap.push(2)
5
/ \
3 2
pop() ⇒ 5(最大の報酬)
- jobByDay[1] = [1]
- Push 1 into maxHeap
Heap: [1]
Pop: 1 ⇒ total = 1
- jobByDay[2] = [4, 3]
- Push 4, 3 into heap
Heap: [4, 3]
Pop: 4 ⇒ total = 1 + 4 = 5
- jobByDay[3] = [4]
- Push 4 into heap
Heap: [4, 3]
Pop: 4 ⇒ total = 5 + 4 = 9
- jobByDay[4] = [2]
- Push 2 into heap
Heap: [3, 2]
Pop: 3 ⇒ total = 9 + 3 = 12
total = 12
| Day | 仕事追加 (Y) | Heap状態 | Pop (最大) | 合計 |
|---|---|---|---|---|
| 1 | [1] | [1] | 1 | 1 |
| 2 | [4, 3] | [4, 3] | 4 | 5 |
| 3 | [4] | [4, 3] | 4 | 9 |
| 4 | [2] | [3, 2] | 3 | 12 |
例:push(4) されたとき:
1. Insert: [3]
2. push(4) → [3, 4]
3. Swap to restore heap: → [4, 3]
Heap: [4, 3, 2]
Pop → 4 (root)
Replace with 2 → [2, 3]
Swap → [3, 2]
| 処理項目 | 計算量 | 備考 |
|---|---|---|
| job分類(O(N)) | O(N) | 各仕事を1回処理 |
| 各日ヒープpush | O(N log N) | 最大N件、1回あたりlogN |
| 各日ヒープpop(D回) | O(D log N) | 最大D日間でpopされる |
| 合計 | O(N log N + D log N) | 高速 |
- 本問題は「日付制約つき最大選択問題」
- 鍵は「毎日、報酬最大の仕事を貪欲に選ぶ」戦略
- TypeScriptでの実装でも型安全・高速処理が可能
必要であれば、TypeScriptコードにインラインで図やログを埋め込むデバッグバージョンも提供可能です。希望があればお知らせください。
| 提出日時 | 問題 | ユーザ | 言語 | 得点 | コード長 | 結果 | 実行時間 | メモリ | |
|---|---|---|---|---|---|---|---|---|---|
| 2025-07-30 17:52:42 | B39 - Taro's Job | myoshizumi | Go (go 1.20.6) | 1000 | 2386 Byte | 39 ms | 12456 KiB | 詳細 | |
| 2025-07-30 17:51:02 | B39 - Taro's Job | myoshizumi | PHP (php 8.2.8) | 1000 | 1510 Byte | 118 ms | 95048 KiB | 詳細 | |
| 2025-07-30 17:47:29 | B39 - Taro's Job | myoshizumi | Python (CPython 3.11.4) | 1000 | 1538 Byte | 176 ms | 60012 KiB | 詳細 | |
| 2025-07-30 17:41:22 | B39 - Taro's Job | myoshizumi | TypeScript 5.1 (Node.js 18.16.1) | 1000 | 2649 Byte | 229 ms | 118112 KiB | 詳細 | |
| 2025-07-30 17:38:44 | B39 - Taro's Job | myoshizumi | JavaScript (Node.js 18.16.1) | 1000 | 2466 Byte | 240 ms | 118920 KiB | 詳細 |