結果

問題 No.5020 Averaging
ユーザー komorin95
提出日時 2025-04-11 14:31:26
言語 Rust
(1.83.0 + proconio)
結果
AC  
実行時間 3 ms / 1,000 ms
コード長 1,960 bytes
コンパイル時間 14,397 ms
コンパイル使用メモリ 402,576 KB
実行使用メモリ 7,720 KB
スコア 18,728,251
最終ジャッジ日時 2025-04-11 14:31:43
合計ジャッジ時間 14,640 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 50
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: unused import: `std::cell::OnceCell`
 --> src/main.rs:3:5
  |
3 | use std::cell::OnceCell;
  |     ^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused imports: `Bytes` and `Usize1`
 --> src/main.rs:5:24
  |
5 | use proconio::marker::{Bytes, Usize1};
  |                        ^^^^^  ^^^^^^

warning: function `card_error_sum` is never used
  --> src/main.rs:61:4
   |
61 | fn card_error_sum(u: (u64, u64)) -> u64 {
   |    ^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

ソースコード

diff #

// -*- coding:utf-8-unix -*-

use std::cell::OnceCell;

use proconio::marker::{Bytes, Usize1};
use proconio::{fastout, input};

const TARGET: u64 = 500_000_000_000_000_000;
const MINV: u64 = 100_000_000_000_000_000;
const TARGET_ADJ: u64 = TARGET - MINV;
const OP_NUM: usize = 50;

#[fastout]
fn main() {
    let _ = get_time();

    input! {
        n: usize,
        mut ab: [(u64, u64); n],
    }

    for x in &mut ab {
        x.0 -= MINV;
        x.1 -= MINV;
    }

    let mut ans = Vec::new();

    for _ in 0..OP_NUM {
        let mut best_v = 0;
        let mut best_score = u64::MAX;
        for v in 1..n {
            let ab_new = card_avg(ab[0], ab[v]);
            let new_score = card_error_max(ab_new);
            if new_score < best_score {
                best_score = new_score;
                best_v = v;
            }
        }
        ans.push((0, best_v));
        ab[0] = card_avg(ab[0], ab[best_v]);
    }

    println!("{}", ans.len());
    for &(u, v) in &ans {
        println!("{} {}", u + 1, v + 1);
    }

    // eprintln!("# Metric end_time float {}", get_time());
    // std::process::exit(0);
}

fn card_avg(u: (u64, u64), v: (u64, u64)) -> (u64, u64) {
    ((u.0 + v.0) / 2, (u.1 + v.1) / 2)
}

fn card_error_max(u: (u64, u64)) -> u64 {
    (u.0.abs_diff(TARGET_ADJ)).max(u.1.abs_diff(TARGET_ADJ))
}

fn card_error_sum(u: (u64, u64)) -> u64 {
    (u.0.abs_diff(TARGET_ADJ)) + (u.1.abs_diff(TARGET_ADJ))
}

//
// MARK: Time Measurement
//

pub fn get_time() -> f64 {
    static mut STIME: f64 = -1.0;
    let t = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap();
    let ms = t.as_secs() as f64 + t.subsec_nanos() as f64 * 1e-9;
    unsafe {
        if STIME < 0.0 {
            STIME = ms;
        }
        ms - STIME
    }
}

#[allow(unused)]
#[cfg(debug_assertions)]
const TIME_LIMIT: f64 = 10.;

#[allow(unused)]
#[cfg(not(debug_assertions))]
const TIME_LIMIT: f64 = 2.9;
0