結果
| 問題 | No.3459 Defeat Slimes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-02-28 16:05:46 |
| 言語 | Rust (1.93.0 + proconio + num + itertools) |
| 結果 |
AC
|
| 実行時間 | 132 ms / 3,000 ms |
| コード長 | 1,984 bytes |
| 記録 | |
| コンパイル時間 | 9,285 ms |
| コンパイル使用メモリ | 203,740 KB |
| 実行使用メモリ | 22,796 KB |
| 最終ジャッジ日時 | 2026-02-28 16:06:02 |
| 合計ジャッジ時間 | 11,143 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
use std::collections::BinaryHeap;
use std::cmp::min;
use proconio::input;
fn main() {
input! {
n: usize, // スライムの種類
mut y: u128, // 現在のレベル
z: u128, // 目標レベル
clx: [(u128, u128, u128); 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() {
// {
// println!("{}", y);
// println!("heap:");
// for (_i, &item) in hp.iter().enumerate() {
// println!("{} {}", item.0, item.1);
// }
// }
// 目標レベルを取得
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");
}