提出 #68048306
ソースコード 拡げる
package main
import (
"bufio"
"container/heap"
"fmt"
"os"
"strconv"
"strings"
)
// Job は仕事の情報(開始日と報酬)を表します。
type Job struct {
startDay int // X_i:開始日
reward int // Y_i:報酬
}
// MaxHeap は報酬を格納する最大ヒープです。
type MaxHeap []int
// Len はヒープの要素数を返します。
func (h MaxHeap) Len() int { return len(h) }
// Less は最大ヒープとして動作させるための比較関数です。
func (h MaxHeap) Less(i, j int) bool { return h[i] > h[j] }
// Swap は要素の入れ替えを行います。
func (h MaxHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
// Push はヒープに要素を追加します。
func (h *MaxHeap) Push(x any) {
*h = append(*h, x.(int))
}
// Pop はヒープから最大値を取り出します。
func (h *MaxHeap) Pop() any {
old := *h
n := len(old)
val := old[n-1]
*h = old[:n-1]
return val
}
/**
* 最大報酬を計算する関数
* @param n int - 仕事数
* @param d int - 就業可能日数
* @param jobs []Job - 各仕事(開始日と報酬)
* @return int - 最大得られる報酬
*/
func getMaxEarnings(n int, d int, jobs []Job) int {
// 各日ごとにできる仕事の報酬リスト
jobByDay := make([][]int, d+1) // 1-based indexing
for _, job := range jobs {
if job.startDay <= d {
jobByDay[job.startDay] = append(jobByDay[job.startDay], job.reward)
}
}
h := &MaxHeap{}
heap.Init(h)
total := 0
for day := 1; day <= d; day++ {
// 今日から可能な仕事をヒープに追加
for _, reward := range jobByDay[day] {
heap.Push(h, reward)
}
// 最大報酬の仕事を1つ実行
if h.Len() > 0 {
total += heap.Pop(h).(int)
}
}
return total
}
// main は標準入力を受け取り、最大報酬を出力します。
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
parts := strings.Fields(scanner.Text())
n, _ := strconv.Atoi(parts[0])
d, _ := strconv.Atoi(parts[1])
jobs := make([]Job, n)
for i := 0; i < n; i++ {
scanner.Scan()
parts := strings.Fields(scanner.Text())
x, _ := strconv.Atoi(parts[0])
y, _ := strconv.Atoi(parts[1])
jobs[i] = Job{startDay: x, reward: y}
}
result := getMaxEarnings(n, d, jobs)
fmt.Println(result)
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | B39 - Taro's Job |
| ユーザ | myoshizumi |
| 言語 | Go (go 1.20.6) |
| 得点 | 1000 |
| コード長 | 2386 Byte |
| 結果 | AC |
| 実行時間 | 39 ms |
| メモリ | 12456 KiB |
ジャッジ結果
| セット名 | Sample | Subtask1 | All | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 200 / 200 | 800 / 800 | ||||||
| 結果 |
|
|
|
| セット名 | テストケース |
|---|---|
| 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 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| rand_01.txt | AC | 29 ms | 11776 KiB |
| rand_02.txt | AC | 18 ms | 7576 KiB |
| rand_03.txt | AC | 19 ms | 8308 KiB |
| rand_04.txt | AC | 12 ms | 6340 KiB |
| rand_05.txt | AC | 14 ms | 7120 KiB |
| rand_06.txt | AC | 39 ms | 12456 KiB |
| sample_01.txt | AC | 1 ms | 1568 KiB |
| subtask1_01.txt | AC | 1 ms | 1700 KiB |
| subtask1_02.txt | AC | 1 ms | 1676 KiB |
| subtask1_03.txt | AC | 1 ms | 1764 KiB |
| subtask1_04.txt | AC | 1 ms | 1672 KiB |
| subtask1_05.txt | AC | 1 ms | 1744 KiB |
| subtask1_06.txt | AC | 1 ms | 1672 KiB |
| subtask1_07.txt | AC | 1 ms | 1784 KiB |
| subtask1_08.txt | AC | 1 ms | 1772 KiB |
| subtask1_09.txt | AC | 1 ms | 1820 KiB |
| subtask1_10.txt | AC | 1 ms | 1664 KiB |