結果

問題 No.475 最終日 - Writerの怠慢
ユーザー tubo28tubo28
提出日時 2016-12-27 23:01:03
言語 Rust
(1.77.0 + proconio)
結果
WA  
実行時間 -
コード長 2,451 bytes
コンパイル時間 13,437 ms
コンパイル使用メモリ 379,764 KB
実行使用メモリ 6,912 KB
最終ジャッジ日時 2024-05-08 21:21:48
合計ジャッジ時間 15,253 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 AC 15 ms
6,528 KB
testcase_13 AC 17 ms
6,528 KB
testcase_14 AC 1 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

fn main(){
    let mut sc = Scanner::new();
    while !sc.eof() {
        let n = sc.next();
        let s = sc.next();
        let wid = sc.next();
        let mut a = vec![0; n];
        for i in 0..n {
            a[i] = sc.next();
        }
        let wscore = 100*s + a[wid];

        let mut p = 1.0;
        for i in 0..n {
            if i == wid {
                continue;
            }
            let mut left = 0;
            let mut right = n;
            while left + 1 < right {
                let mid = (left + right) / 2;
                if a[i] + score(mid, s) > wscore {
                    left = mid;
                } else {
                    right = mid;
                }
            }
            let x = 1.0 - left as f64 / (n-1) as f64;
            p *= x;
        }
        println!("{:.10}", p);
    }
}

fn score(rank: usize, star: i32) -> i32 {
    return 50*star + 500*star / (8 + 2*rank as i32);
}

// Scanner
struct Scanner { token_buffer: Vec<String>, index: usize }

#[allow(dead_code)]
impl Scanner {
    fn new() -> Scanner {
        Scanner { token_buffer: vec![], index: 0 }
    }

    fn next<T>(&mut self) -> T where T: std::str::FromStr {
        self.wrapped::<T>().unwrap()
    }

    fn wrapped<T>(&mut self) -> Option<T> where T: std::str::FromStr {
        match self.get_token() {
            Some(s) => {
                match s.parse::<T>() {
                    Ok(x) => Some(x),
                    Err(_) => None
                }
            },
            None => None
        }
    }

    fn eof(&mut self) -> bool {
        if !self.read_line() {
            true
        } else {
            self.index >= self.token_buffer.len()
        }
    }

    fn get_token(&mut self) -> Option<&String> {
        if !self.read_line() {
            None
        } else {
            self.index += 1;
            Some(&self.token_buffer[self.index - 1])
        }
    }

    fn read_line(&mut self) -> bool {
        while self.index >= self.token_buffer.len() {
            let mut st = String::new();
            while st.trim() == "" {
                match std::io::stdin().read_line(&mut st) {
                    Ok(l) if l > 0 => continue,
                    _ => return false
                }
            }
            self.token_buffer = st.split_whitespace()
                .map(|x| x.to_string())
                .collect();
            self.index = 0;
        }
        true
    }
}
0