Skip to content

Max Satisfaction

LeetCode Problem

# https://leetcode.com/problems/reducing-dishes/description/
"""
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.

Max sum : sort input array in decreasing order (ensures max satisfaction level value at front)
[5,0,-1,-8,-9]
ans = 0
prefix_sum = 0

pick 5
pick first val, add to prefix_sum, before adding prefix_sum to ans check if it's positive. ans += prefix_sum
    [prefix_sum shouldn't be negative]

now 0
prefix_sum = 5 + 0 = 5, ans += prefix_sum = 5 + 5 = 10

-1
prefix_sum = 4, prefix_sum is still pos, ans = 10 + 4 = 14

-8
prefix_sum = 4 +(-8) = -4, prefix_sum is negative : ignore, similarly ignore -9

return ans
Time : O(n*log(n))
"""


class Solution:
    def maxSatisfaction(self, satisfaction: List[int]) -> int:
        satisfaction.sort(reverse=True)
        ans, prefix_sum = 0, 0
        for i in range(len(satisfaction)):
            prefix_sum += satisfaction[i]
            if prefix_sum < 0:
                break
            ans += prefix_sum
        return ans