結果
| 問題 | No.3459 Defeat Slimes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-04 21:13:56 |
| 言語 | Rust (1.93.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 112 ms / 3,000 ms |
| コード長 | 1,788 bytes |
| 記録 | |
| コンパイル時間 | 14,020 ms |
| コンパイル使用メモリ | 202,268 KB |
| 実行使用メモリ | 12,684 KB |
| 最終ジャッジ日時 | 2026-03-04 21:53:58 |
| 合計ジャッジ時間 | 28,381 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
use std::collections::BinaryHeap;
use std::cmp::min;
use proconio::input;
fn main() {
input! {
n: usize, // スライムの種類
mut y: u64, // 現在のレベル
z: u64, // 目標レベル
clx: [(u64, u64, u64); n], // 各スライム(匹,必要レベル,獲得レベル)
}
// スライムの情報を必要レベルが大きい順に並べる
// dummyを入れる
let mut slime_info = Vec::new();
slime_info.push((z, 0, 0)); // (必要レベル, 獲得レベル, 匹)
for (c, l, x) in clx {
slime_info.push((l, x, c));
}
slime_info.sort_by(|i, j| j.cmp(i));
// 倒す匹
let mut ans = 0;
// 今のレベル以下のものを追加(獲得レベル, 匹)
let mut hp = BinaryHeap::new();
loop {
let (l, x, c) = *slime_info.last().unwrap();
if y >= l {
hp.push((x, c));
slime_info.pop();
}
else {
break;
}
}
// 獲得レベルが高い順に調べる
while let Some((x, c)) = hp.pop() {
// 目標レベルを取得
let (next, nx, nc) = *slime_info.last().unwrap();
// 必要数だけ倒してレベルを上げる
let mut cnt = (next - y + x-1) / x;
cnt = min(cnt, c);
y += cnt * x;
ans += cnt;
// 過剰に取り出した分は戻す
if c > cnt {
hp.push((x, c - cnt));
}
// 最終レベルに到達
if y >= z {
println!("{}", ans);
return;
}
// 次の目標レベルを超えたら、キューを追加
if y >= next {
hp.push((nx, nc));
slime_info.pop();
}
}
println!("-1");
}