結果
| 問題 |
No.873 バイナリ、ヤバいなり!w
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 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();
}
akakimidori