結果

問題 No.3459 Defeat Slimes
コンテスト
ユーザー NakLon131
提出日時 2026-03-04 21:13:56
言語 Rust
(1.93.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 112 ms / 3,000 ms
コード長 1,788 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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");
}
0