diff --git a/src/main.rs b/src/main.rs index ecbc2cf..5932553 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,54 @@ +use std::cmp::min; +use std::collections::HashMap; + struct Solution; impl Solution { - pub fn generate(num_rows: i32) -> Vec> { - let mut ans : Vec>= vec![vec![1]]; - for i in 1..num_rows { - let mut row = vec![1]; - let prev_row = &ans[(i - 1) as usize]; - for j in 1..prev_row.len() { - row.push(prev_row[j - 1] + prev_row[j]); - } - row.push(1); - ans.push(row); + 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; } - ans + 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::generate(7); + let sl = Solution::min_cost(vec![4,2,2,2], vec![1,4,1,2]); println!("{:?}", sl); }