# Leetcode 1402. Reducing Dishes
給定n道菜餚array名叫satisfaction,你可以按照任何順序挑選,則需要得到最大的價值,價值算法為,你第幾個挑選到的菜餚的計數*該菜餚的水平,想出解決方案,讓該價值為最大。
## 想法
因為可以按照任何順序選取,所以水平較高的菜餚理應比較慢選,以得到較高的計數價值,所以我們先將satisfaction從大到小排序,再開始拿取。
1.首先 我們設定3個變數
best:為最佳解,也是我們最後的答案。
total:紀錄目前總答案。
esum:目前加入新的菜餚是否對於total的增加有幫助。
當esum為負時代表,接下來選擇菜餚都沒辦法使best增加,則可以跳出。
證明,以[3,2,1]為例:
第一個周期:
esum = 3
total = 3
best = 3
第二個周期:
esum = 3+2 = 5
total = 3+5 = 8 (因為重複加esum所以會得到 3*2+2*1的結果)
best = 8
第三個周期:
esum = 3+2+1 = 6
total = 3+5+6 = 14 (因為重複加esum所以會得到 3*3+2*2+1*1的結果)
best = 14
特別的點為esum的計算,因為累加的性質,造成前面的計數的乘數不斷+1的狀態完美的解決這題的題幹。
程式碼:
```
def maxSatisfaction(self, satisfaction: List[int]) -> int:
satisfaction.sort(reverse=True)
best,esum,total = 0,0,0
for x in satisfaction:
esum += x
total += esum
best = max(total,best)
if esum<0:
break
return best
```