use std::cmp::min; use std::collections::HashMap; struct Solution; impl Solution { pub fn min_cost(basket1: Vec, basket2: Vec) -> i64 { let mut map : HashMap = HashMap::new(); let mut total_cost: i64 = 0; let mut min_cost = i32::MAX; for i in basket1.iter() { *map.entry(*i).or_insert(0) += 1; } for i in basket2.iter() { *map.entry(*i).or_insert(0) -= 1; } let mut kvs: Vec<(i32, i32)> = map.iter().filter(|(k, v)| {min_cost = min(min_cost, **k); if **v == 0 {false} else {true}}).map(|(k, v)| (*k, *v)).collect(); let mut err = false; kvs.sort_by(|a, b| { err |= b.1 % 2 == 1 || a.1 % 2 == 1; if a.1 > 0 && b.1 < 0 { std::cmp::Ordering::Greater } else if a.1 < 0 && b.1 > 0 { std::cmp::Ordering::Less } else { a.0.cmp(&b.0) } }); if err { return -1; } if kvs.is_empty() { return 0; } let mut l = 0; let mut r = kvs.len() - 1; while l < r { let cost = min( kvs[l].1.abs(), kvs[r].1.abs()) as i64; total_cost += min(min(kvs[l].0, kvs[r].0) as i64 * cost / 2,min_cost as i64 * cost); kvs[l].1 += cost as i32; kvs[r].1 -= cost as i32; if kvs[l].1 >= 0 { l+=1; } if kvs[r].1 <= 0 { r-=1; } } if kvs[l].1 > 0 || kvs[r].1 > 0 { -1 } else { total_cost } } } fn main() { let sl = Solution::min_cost(vec![4,2,2,2], vec![1,4,1,2]); println!("{:?}", sl); }