結果
| 問題 |
No.448 ゆきこーだーの雨と雪 (3)
|
| ユーザー |
tanzaku
|
| 提出日時 | 2017-02-18 17:41:03 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 203 ms / 2,000 ms |
| コード長 | 1,883 bytes |
| コンパイル時間 | 15,701 ms |
| コンパイル使用メモリ | 379,644 KB |
| 実行使用メモリ | 8,128 KB |
| 最終ジャッジ日時 | 2024-12-21 09:25:28 |
| 合計ジャッジ時間 | 21,881 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 35 |
ソースコード
fn get_line() -> Vec<String> {
let stdin = std::io::stdin();
let mut s = String::new();
loop {
stdin.read_line(&mut s).ok();
let s = s.trim();
if s.len() != 0 {
return s.split_whitespace().map(|s| s.into()).collect();
}
}
}
fn main() {
let l = get_line();
let n: usize = l[0].parse().unwrap();
let k: usize = l[1].parse().unwrap();
let mut t: Vec<i64> = vec![0; n];
let mut d: Vec<i64> = vec![0; n];
for i in 0..n {
let l = get_line();
t[i] = l[0].parse().unwrap();
d[i] = l[1].parse().unwrap();
}
let solve = |threshold: i64| {
let mut prev = 0;
let mut left = 0;
let mut dp = vec![std::i64::MAX / 2; n+1];
let mut sum = vec![0i64; n+1];
dp[0] = 0;
for i in 0..n {
while t[i] - t[left] >= (k as i64) {
left += 1;
}
sum[i+1] = sum[i] + d[i];
if left >= prev {
dp[i+1] = std::cmp::min(dp[i+1], dp[left] + sum[i] - sum[left]);
}
if d[i] <= threshold {
dp[i+1] = std::cmp::min(dp[i+1], dp[i] + d[i]);
} else {
if left < prev {
return -1;
}
prev = i + 1;
}
}
// if *threshold == 6 {
// for (i,j) in (0..n+1).enumerate() {
// println!("{} {}", i, dp[j]);
// }
// }
dp[n]
};
let mut low = -1;
let mut high = 1i64<<30;
while high - low > 1 {
let mid = (low + high) / 2;
let ans = solve(mid);
if ans >= 0 {
high = mid;
} else {
low = mid;
}
// println!("{} {} {}", low, high, ans);
}
println!("{}", high);
println!("{}", solve(high));
}
tanzaku