use proconio::input; fn main() { input! { n: usize, a: [i64; n], } let (first, second) = a.split_at(n / 2); let p = enumerate(&first); let q = enumerate(&second); let mut ans = i64::MAX; for i in 0..=n / 2 { let p = &p[i]; let q = &q[n / 2 - i]; for &p in p { let i = q.partition_point(|&q| p + q < 0); if i < q.len() { let cand = p + q[i]; ans = ans.min(cand.abs()); } if i > 0 { let cand = p + q[i - 1]; ans = ans.min(cand.abs()); } } } println!("{ans}"); } fn enumerate(a: &[i64]) -> Vec> { let n = a.len(); let mut res = vec![vec![]; n + 1]; for bits in 0usize..1 << n { let sum = (0..n) .map(|i| if bits >> i & 1 == 0 { a[i] } else { -a[i] }) .sum::(); res[bits.count_ones() as usize].push(sum); } res.iter_mut().for_each(|v| v.sort_unstable()); res }