結果
問題 | No.1583 Building Blocks |
ユーザー | shino16 |
提出日時 | 2021-04-04 15:59:50 |
言語 | Rust (1.77.0 + proconio) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,329 bytes |
コンパイル時間 | 16,557 ms |
コンパイル使用メモリ | 384,540 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-29 04:37:03 |
合計ジャッジ時間 | 15,011 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 0 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,944 KB |
testcase_03 | WA | - |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | AC | 1 ms
6,944 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | AC | 1 ms
6,944 KB |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | AC | 1 ms
6,940 KB |
testcase_25 | AC | 1 ms
6,940 KB |
testcase_26 | AC | 1 ms
6,944 KB |
testcase_27 | AC | 1 ms
6,944 KB |
testcase_28 | AC | 1 ms
6,940 KB |
testcase_29 | AC | 1 ms
6,940 KB |
testcase_30 | AC | 1 ms
6,940 KB |
testcase_31 | AC | 2 ms
6,940 KB |
testcase_32 | AC | 1 ms
6,944 KB |
testcase_33 | AC | 1 ms
6,940 KB |
testcase_34 | AC | 1 ms
6,944 KB |
testcase_35 | AC | 1 ms
6,944 KB |
testcase_36 | AC | 1 ms
6,944 KB |
testcase_37 | AC | 1 ms
6,944 KB |
testcase_38 | AC | 1 ms
6,940 KB |
testcase_39 | AC | 1 ms
6,944 KB |
testcase_40 | AC | 1 ms
6,940 KB |
testcase_41 | AC | 0 ms
6,940 KB |
testcase_42 | AC | 1 ms
6,940 KB |
testcase_43 | AC | 1 ms
6,940 KB |
testcase_44 | AC | 1 ms
6,944 KB |
testcase_45 | AC | 1 ms
6,940 KB |
ソースコード
// 嘘解法のつもり use crate::lib::stdio::*; use crate::lib::slice::*; fn main() { scan!(n: usize, mut ws: [(u64, u64); n]); // (w1, s1) の下に (w2, s2) があり、w1 + s1 >= w2 + s2 であるとき、 // s2 - w1 <= s2, s2 - w1 <= s1 - w2 より、 // これら 2 つの積み木を swap しても min(s1, s2 - w1) は減少しない。 ws.sort_unstable_by_key(|&(w, s)| w + s); // dp[X]: 条件を満たす X 個の積み木の重みの和の最小値 let mut dp = vec![u64::MAX; n + 1]; dp[0] = 0; for &(w, s) in &ws { let i = upper_bound(&dp, &s) - 1; dp[i + 1] = dp[i + 1].min(dp[i] + w); } for i in (0..=n).rev() { if dp[i] != u64::MAX { prtln!(i); return; } } } pub mod lib { pub mod slice { pub fn partition_point<T>(slice: &[T], mut pred: impl FnMut(&T) -> bool) -> usize { let (mut l, mut r) = (0, slice.len()); // pred(slice[r]) == false while l != r { let mid = (l + r) / 2; let val = unsafe { slice.get_unchecked(mid) }; if pred(val) { l = mid + 1; } else { r = mid; } } r } pub fn lower_bound<T: Ord>(slice: &[T], v: &T) -> usize { partition_point(slice, |x| x < v) } pub fn upper_bound<T: Ord>(slice: &[T], v: &T) -> usize { partition_point(slice, |x| x <= v) } } // mod slice pub mod stdio { pub use crate::prtln; pub use crate::scan; use std::io::{stdout, BufWriter, StdoutLock}; pub fn stdout_buf() -> BufWriter<StdoutLock<'static>> { let out = Box::leak(Box::new(stdout())); BufWriter::new(out.lock()) } #[macro_export] macro_rules! prtln { (@ $dst:expr, iter=$expr:expr) => { $crate::prtln!(@ $dst, iter=$expr, sep=" "); }; (@ $dst:expr, iter=$expr:expr, sep=$sep:expr) => { { let mut iter = $expr.into_iter(); if let Some(expr) = iter.next() { std::write!($dst, "{}", expr).unwrap(); for expr in iter { std::write!($dst, "{}{}", $sep, expr).unwrap(); } } $crate::prtln!(@ $dst, ""); } }; (@ $dst:expr, $expr:expr, no eol) => { std::write!($dst, "{}", $expr).unwrap(); }; (@ $dst:expr, $expr:expr) => { std::writeln!($dst, "{}", $expr).unwrap(); }; (@ $dst:expr, $expr:expr, $($exprs:expr),*) => { { std::write!($dst, "{} ", $expr).unwrap(); $crate::prtln!(@ $dst, $($exprs),*); } }; (new $var:ident $(,)?) => { let mut $var = stdout_buf(); }; (new $var:ident, $($t:tt)*) => { $crate::prtln!(new $var); $crate::prtln!(to $var, $($t)*); }; (to $var:ident, $($t:tt)*) => { { use std::io::Write; $crate::prtln!(@ $var, $($t)*); } }; ($($t:tt)*) => { { $crate::prtln!(new __prtln, $($t)*); std::mem::drop(__prtln); } }; } #[macro_export] macro_rules! scan { (@ $iter:expr $(,)?) => {}; (@ $iter:expr, mut $var:ident : $t:tt $($r:tt)*) => { #[allow(non_snake_case)] let mut $var = $crate::scan_value!($iter, $t); $crate::scan!(@ $iter $($r)*) }; (@ $iter:expr, $var:ident : $t:tt $($r:tt)*) => { #[allow(non_snake_case)] let $var = $crate::scan_value!($iter, $t); $crate::scan!(@ $iter $($r)*) }; (@ $iter:expr, $pat:pat in $t:tt $($r:tt)*) => { let $pat = $crate::scan_value!($iter, $t); $crate::scan!(@ $iter $($r)*) }; (from $s:expr, $($r:tt)*) => { $crate::scan!(@ $s, $($r)*); }; (new $var:ident, $($r:tt)*) => { let mut __input = String::new(); std::io::Read::read_to_string(&mut std::io::stdin(), &mut __input).unwrap(); let $var = &mut __input.split_ascii_whitespace(); $crate::scan!(@ $var, $($r)*); }; ($($r:tt)*) => { $crate::scan!(new __scan, $($r)*); }; } #[macro_export] macro_rules! scan_value { ($iter:expr, ( $($t:tt),* )) => { ( $($crate::scan_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| $crate::scan_value!($iter, $t)).collect::<Vec<_>>() }; ($iter:expr, bytes) => { $iter.next().unwrap().as_bytes() }; ($iter:expr, usize1) => { $crate::scan_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().unwrap() }; } } // mod stdio } // mod lib