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])); | |||||
} |
A chef has collected data on the satisfaction level of his n dishes. Chef can cook any dish in 1 unit of time. | |||||
Like-time coefficient of a dish is defined as the time taken to cook that dish including previous dishes multiplied by its satisfaction level i.e. time[i]*satisfaction[i] | |||||
Return the maximum sum of Like-time coefficient that the chef can obtain after dishes preparation. | |||||
Dishes can be prepared in any order and the chef can discard some dishes to get this maximum value. | |||||
Example 1: | |||||
Input: satisfaction = [-1,-8,0,5,-9] | |||||
Output: 14 | |||||
Explanation: After Removing the second and last dish, the maximum total Like-time coefficient will be equal to (-1*1 + 0*2 + 5*3 = 14). Each dish is prepared in one unit of time. | |||||
Example 2: | |||||
Input: satisfaction = [4,3,2] | |||||
Output: 20 | |||||
Explanation: Dishes can be prepared in any order, (2*1 + 3*2 + 4*3 = 20) | |||||
Example 3: | |||||
Input: satisfaction = [-1,-4,-5] | |||||
Output: 0 | |||||
Explanation: People don't like the dishes. No dish is prepared. | |||||
Example 4: | |||||
Input: satisfaction = [-2,5,-1,0,3,-3] | |||||
Output: 35 | |||||
Constraints: | |||||
n == satisfaction.length | |||||
1 <= n <= 500 | |||||
-10^3 <= satisfaction[i] <= 10^3 |
#!/bin/bash | |||||
rustc main.rs | |||||
./main | |||||
rm main |