Files
CodeObject/storage/zeta/rs/5018.rs
2026-04-09 23:56:17 +09:00

119 lines
3.2 KiB
Rust

use std::{
collections::HashSet,
io::{read_to_string, stdin},
};
const ROW_MAX: usize = 12;
fn array_sum(a: &[usize; ROW_MAX + 1], b: &[usize; ROW_MAX + 1]) -> [usize; ROW_MAX + 1] {
let mut c = [0; ROW_MAX + 1];
for i in 0..ROW_MAX + 1 {
c[i] = a[i] + b[i];
}
c
}
fn consume_check(groups_remain: &[usize; ROW_MAX + 1], cx: &[usize; ROW_MAX + 1]) -> bool {
groups_remain.iter().zip(cx.iter()).all(|(g, c)| g >= c)
}
fn consume(groups_remain: &mut [usize; ROW_MAX + 1], cx: &[usize; ROW_MAX + 1]) {
for i in 0..ROW_MAX + 1 {
groups_remain[i] -= cx[i];
}
}
fn restore(groups_remain: &mut [usize; ROW_MAX + 1], cx: &[usize; ROW_MAX + 1]) {
for i in 0..ROW_MAX + 1 {
groups_remain[i] += cx[i];
}
}
fn check_empty(groups_remain: &[usize; ROW_MAX + 1]) -> bool {
groups_remain.iter().all(|&g| g == 0)
}
fn main() {
let temp = read_to_string(stdin()).unwrap();
let mut iter = temp
.split_ascii_whitespace()
.map(|x| x.parse::<usize>().unwrap());
let n = iter.next().unwrap();
let mut groups = [0; ROW_MAX + 1];
for i in 1..=n {
groups[i] = iter.next().unwrap();
}
let mut cands: Vec<HashSet<[usize; ROW_MAX + 1]>> = vec![HashSet::new(); ROW_MAX + 1];
cands[0].insert([0; ROW_MAX + 1]);
cands[1].insert([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
cands[2].insert([0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
for i in 3..=ROW_MAX {
let mut arr = [0; ROW_MAX + 1];
arr[i] = 1;
cands[i].insert(arr);
for j in i / 2..i - 1 {
let k = i - 1 - j;
let mut v = vec![];
for can1 in cands[j].iter() {
for can2 in cands[k].iter() {
v.push(array_sum(can1, can2));
}
}
for a in v {
cands[i].insert(a);
}
}
}
let mut deq = vec![];
deq.push((0, 1, [0usize; ROW_MAX + 1]));
let mut res = 13;
while !deq.is_empty() {
let (type_id, level, delta) = deq.pop().unwrap();
if type_id == 0 {
consume(&mut groups, &delta);
if check_empty(&groups) {
res = res.min(level - 1);
continue;
}
if level >= 13 {
continue;
}
let mut flag = false;
for i in (1..=level).rev() {
let v = cands[i]
.iter()
.filter(|c| consume_check(&groups, c))
.collect::<Vec<_>>();
if v.is_empty() {
continue;
}
flag = true;
for &e in v {
deq.push((1, level + 1, e));
deq.push((0, level + 1, e));
}
}
if !flag {
for &e in cands[0].iter() {
deq.push((1, level + 1, e));
deq.push((0, level + 1, e));
}
}
} else {
restore(&mut groups, &delta);
}
}
if res >= 13 {
println!("{}", -1);
} else {
println!("{}", res);
}
}