結果

問題 No.475 最終日 - Writerの怠慢
ユーザー tubo28tubo28
提出日時 2016-12-27 23:37:24
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 19 ms / 2,000 ms
コード長 2,412 bytes
コンパイル時間 12,218 ms
コンパイル使用メモリ 378,904 KB
実行使用メモリ 6,912 KB
最終ジャッジ日時 2024-06-06 10:46:40
合計ジャッジ時間 13,424 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 19 ms
6,784 KB
testcase_05 AC 18 ms
6,656 KB
testcase_06 AC 18 ms
6,912 KB
testcase_07 AC 17 ms
6,912 KB
testcase_08 AC 18 ms
6,784 KB
testcase_09 AC 18 ms
6,912 KB
testcase_10 AC 18 ms
6,656 KB
testcase_11 AC 18 ms
6,784 KB
testcase_12 AC 10 ms
6,528 KB
testcase_13 AC 16 ms
6,688 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; 0];
        let mut wscore = 0;
        for i in 0..n {
            let x = sc.next();
            if i == wid {
                wscore = 100*s + x;
            } else {
                a.push(x);
            }
        }

        let mut p = 1.0;
        a.sort();
        let mut i = 0;
        for r in 1..n {
            while i < a.len() && a[i] + score(r, s) <= wscore {
                i += 1;
            }
            if r <= i+1 {
                p *= (i+1-r) as f64 / (n-r) as f64;
            } else {
                p = 0.0;
                break;
            }
        }
        println!("{:.10}", p);
    }
}

fn score(rank: usize, star: i32) -> i32 {
    return 50*star + 250*star / (4 + 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