Submission #68048062
Source Code Expand
import * as fs from 'fs';
/**
* 仕事情報型: [開始日, 報酬]
*/
type Job = [number, number];
/**
* 最大収益を求める関数
* @param N - 仕事の件数(1 ≦ N ≦ 2×10^5)
* @param D - 就業可能日数(1 ≦ D ≦ 2000)
* @param jobs - 各仕事の情報(開始可能日、報酬)
* @returns 最大で得られる報酬
*/
function getMaxEarnings(N: number, D: number, jobs: Job[]): number {
const jobByDay: number[][] = Array.from({ length: D + 1 }, () => []);
// 各日の仕事を分類
for (const [x, y] of jobs) {
if (x <= D) jobByDay[x].push(y);
}
const maxHeap = new MaxHeap();
let total = 0;
for (let day = 1; day <= D; day++) {
for (const reward of jobByDay[day]) {
maxHeap.push(reward);
}
if (maxHeap.size() > 0) {
total += maxHeap.pop()!;
}
}
return total;
}
/**
* 最大ヒープクラス(優先度付きキュー)
*/
class MaxHeap {
private data: number[] = [];
push(val: number): void {
this.data.push(val);
this.heapifyUp(this.data.length - 1);
}
pop(): number | undefined {
if (this.data.length === 0) return undefined;
const top = this.data[0];
const last = this.data.pop()!;
if (this.data.length > 0) {
this.data[0] = last;
this.heapifyDown(0);
}
return top;
}
size(): number {
return this.data.length;
}
private heapifyUp(i: number): void {
while (i > 0) {
const parent = (i - 1) >> 1;
if (this.data[parent] >= this.data[i]) break;
[this.data[parent], this.data[i]] = [this.data[i], this.data[parent]];
i = parent;
}
}
private heapifyDown(i: number): void {
const n = this.data.length;
while (true) {
let largest = i;
const left = 2 * i + 1;
const right = 2 * i + 2;
if (left < n && this.data[left] > this.data[largest]) largest = left;
if (right < n && this.data[right] > this.data[largest]) largest = right;
if (largest === i) break;
[this.data[i], this.data[largest]] = [this.data[largest], this.data[i]];
i = largest;
}
}
}
/**
* 標準入力からデータを読み込み、最大収益を出力
*/
function main(): void {
const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
const [N, D] = input[0].split(' ').map(Number);
const jobs: Job[] = input.slice(1).map(line => {
const [x, y] = line.split(' ').map(Number);
return [x, y];
});
const result = getMaxEarnings(N, D, jobs);
console.log(result);
}
main();
Submission Info
| Submission Time | |
|---|---|
| Task | B39 - Taro's Job |
| User | myoshizumi |
| Language | TypeScript 5.1 (Node.js 18.16.1) |
| Score | 1000 |
| Code Size | 2649 Byte |
| Status | AC |
| Exec Time | 229 ms |
| Memory | 118112 KiB |
Compile Error
Judge Result
| Set Name | Sample | Subtask1 | All | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 200 / 200 | 800 / 800 | ||||||
| Status |
|
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample_01.txt |
| Subtask1 | sample_01.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt |
| All | rand_01.txt, rand_02.txt, rand_03.txt, rand_04.txt, rand_05.txt, rand_06.txt, sample_01.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| rand_01.txt | AC | 210 ms | 108688 KiB |
| rand_02.txt | AC | 151 ms | 88120 KiB |
| rand_03.txt | AC | 155 ms | 88924 KiB |
| rand_04.txt | AC | 122 ms | 74604 KiB |
| rand_05.txt | AC | 127 ms | 75716 KiB |
| rand_06.txt | AC | 229 ms | 118112 KiB |
| sample_01.txt | AC | 39 ms | 42692 KiB |
| subtask1_01.txt | AC | 42 ms | 43884 KiB |
| subtask1_02.txt | AC | 41 ms | 43824 KiB |
| subtask1_03.txt | AC | 43 ms | 44732 KiB |
| subtask1_04.txt | AC | 41 ms | 43984 KiB |
| subtask1_05.txt | AC | 42 ms | 44512 KiB |
| subtask1_06.txt | AC | 40 ms | 43944 KiB |
| subtask1_07.txt | AC | 48 ms | 49200 KiB |
| subtask1_08.txt | AC | 44 ms | 44712 KiB |
| subtask1_09.txt | AC | 50 ms | 49256 KiB |
| subtask1_10.txt | AC | 40 ms | 43376 KiB |