結果
問題 | No.873 バイナリ、ヤバいなり!w |
ユーザー |
![]() |
提出日時 | 2019-08-30 22:57:44 |
言語 | Rust (1.83.0 + proconio) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,021 bytes |
コンパイル時間 | 13,986 ms |
コンパイル使用メモリ | 400,928 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-06-24 01:43:26 |
合計ジャッジ時間 | 16,271 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 WA * 2 |
ソースコード
fn run() {let mut s = String::new();std::io::stdin().read_line(&mut s).unwrap();let n: usize = s.trim().parse().unwrap();let mut dp = vec![(0, 0); n + 1];for i in 1..=n {let mut s = dp[i - 1];s.0 += 1;s.1 += 1;let mut j = 2;while j * j <= i {let v = dp[i - j * j];if s.0 > v.0 + j {s = v;s.0 += j;} else if s.0 == v.0 + j && s.1 < v.1 {s = v;s.0 += j;}j += 1;}dp[i] = s;}let mut a = vec![];let mut m = n;while m > 0 {if dp[m].1 > 0 {a.push(1);m -= 1;continue;}let mut find = false;let mut j = 3;while j * j <= m && !find{if dp[m - j * j].0 + j == dp[m].0 {find = true;m -= j * j;a.push(j);}j += 2;}let mut j = 2;while j * j <= m && !find {if dp[m - j * j].0 + j == dp[m].0 {find = true;m -= j * j;a.push(j);}j += 2;}}a.sort_by(|a, b| {if a % 2 == b % 2 {if a % 2 == 1 {a.cmp(&b)} else {b.cmp(&a)}} else if a % 2 == 1 {std::cmp::Ordering::Less} else {std::cmp::Ordering::Greater}});let mut ans = String::new();let mut prev = '0';for mut a in a {ans.push(prev);a -= 1;while a > 1 {ans.push(if prev == '1' {'0'} else {'1'});ans.push(prev);a -= 2;}if a > 0 {ans.push(if prev == '1' {'0'} else {'1'});prev = if prev == '1' {'0'} else {'1'};}}println!("{}", ans);}fn main() {run();}