use std::cmp; pub fn max_satisfaction(mut satisfaction: Vec) -> i32 { // First we want to sort the dishes, because the maximum like-time will come // when the last dishes are highest in number - then we just need to work out which ones to cull // there is one case that can probably be optimised: all negative (cook nothing) // but it might be easier to just build that into the starting logic satisfaction.sort_by(|a, b| b.cmp(a)); let mut max = 0; let mut sum = 0; // sum will count how much will be added by multiplying the end of the arr // Now loop backwards over the array seeing if it makes things better to add dishes // Note: The array has been reversed, so it's actually going forwards, trippy right? for dish in satisfaction { let total = max + dish + sum; // This is the total if this dish was added if total > max { sum = sum + dish; max = total; } else { return max; // we can't do better, stop here } } return cmp::max(0, max); } pub fn main() { println!("Expected: 20"); println!("Got: {}", max_satisfaction(vec![4, 3, 2])); }