12345678910111213141516171819202122232425262728 |
- use std::cmp;
-
- pub fn max_satisfaction(mut satisfaction: Vec<i32>) -> 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]));
- }
|