結果
| 問題 |
No.545 ママの大事な二人の子供
|
| コンテスト | |
| ユーザー |
fukafukatani
|
| 提出日時 | 2018-11-21 23:23:08 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,881 bytes |
| コンパイル時間 | 12,661 ms |
| コンパイル使用メモリ | 387,484 KB |
| 最終ジャッジ日時 | 2024-11-14 20:41:12 |
| 合計ジャッジ時間 | 13,426 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
error: expected one of `:`, `@`, or `|`, found `)` --> src/main.rs:16:29 | 16 | fn lower_bound(&self, &T) -> usize; | ^ expected one of `:`, `@`, or `|` | = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) help: if this is a parameter name, give it a type | 16 | fn lower_bound(&self, T: &TypeName) -> usize; | ~~~~~~~~~~~~ help: if this is a type, explicitly ignore the parameter name | 16 | fn lower_bound(&self, _: &T) -> usize; | ++ error: expected one of `:`, `@`, or `|`, found `)` --> src/main.rs:17:29 | 17 | fn upper_bound(&self, &T) -> usize; | ^ expected one of `:`, `@`, or `|` | = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) help: if this is a parameter name, give it a type | 17 | fn upper_bound(&self, T: &TypeName) -> usize; | ~~~~~~~~~~~~ help: if this is a type, explicitly ignore the parameter name | 17 | fn upper_bound(&self, _: &T) -> usize; | ++ warning: unused import: `std::collections::*` --> src/main.rs:1:5 | 1 | use std::collections::*; | ^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default error: could not compile `main` (bin "main") due to 2 previous errors; 1 warning emitted
ソースコード
use std::collections::*;
use std::cmp::Ordering;
fn read<T: std::str::FromStr>() -> T {
let mut s = String::new();
std::io::stdin().read_line(&mut s).ok();
s.trim().parse().ok().unwrap()
}
fn read_vec<T: std::str::FromStr>() -> Vec<T> {
read::<String>().split_whitespace()
.map(|e| e.parse().ok().unwrap()).collect()
}
trait BinarySearch<T> {
fn lower_bound(&self, &T) -> usize;
fn upper_bound(&self, &T) -> usize;
}
impl<T: Ord> BinarySearch<T> for [T] {
fn lower_bound(&self, x: &T) -> usize {
let mut low = 0;
let mut high = self.len();
while low != high {
let mid = (low + high) / 2;
match self[mid].cmp(x) {
Ordering::Less => {
low = mid + 1;
}
Ordering::Equal | Ordering::Greater => {
high = mid;
}
}
}
low
}
fn upper_bound(&self, x: &T) -> usize {
let mut low = 0;
let mut high = self.len();
while low != high {
let mid = (low + high) / 2;
match self[mid].cmp(x) {
Ordering::Less | Ordering::Equal => {
low = mid + 1;
}
Ordering::Greater => {
high = mid;
}
}
}
low
}
}
fn main() {
let n = read::<usize>();
let mut a = vec![0; n];
let mut b = vec![0; n];
for i in 0..n {
let v = read_vec::<i64>();
a[i] = v[0];
b[i] = v[1];
}
if n == 1 {
println!("{:?}", std::cmp::min(a[0], b[0]));
return;
}
let half = (n / 2) as u32;
let mut half_cominations: Vec<i64> = Vec::new();
for i in 0..2usize.pow(half) {
let mut i = i;
let mut num: i64 = 0;
for j in 0..half {
if i % 2 == 0 {
num += a[j as usize];
} else {
num -= b[j as usize];
}
i /= 2;
}
half_cominations.push(num);
}
half_cominations.sort();
let mut ans = std::i64::MAX;
let latter_half = n as u32 - half;
for i in 0..2usize.pow(latter_half) {
let mut i = i;
let mut num: i64 = 0;
for j in half..n as u32 {
if i % 2 == 0 {
num += a[j as usize];
} else {
num -= b[j as usize];
}
i /= 2;
}
let lb = half_cominations.lower_bound(&-num);
if lb > 0 {
let upper = half_cominations[lb - 1] + num;
ans = std::cmp::min(upper.abs(), ans);
}
if lb < half_cominations.len() {
let lower = half_cominations[lb] + num;
ans = std::cmp::min(lower.abs(), ans);
}
}
println!("{:?}", ans);
}
fukafukatani