题目链接:力扣https://leetcode-cn.com/problems/reducing-dishes/
题意:
一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。
一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。
请你返回做完所有菜 「喜爱时间」总和的最大值为多少。
你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。
方法一:滑动窗口
class Solution {
public:
int maxSatisfaction(vector<int>& satisfaction) {
sort(satisfaction.begin(),satisfaction.end());//从小到大排序
int maxV = 0;//最大价值
int size = satisfaction.size();//获取长度
for(int i=0;i<size;i++)//枚举起始位置
{
int totalT=0;//以i作为起始位置能获得的总价值
for(int j=1,k=i;j<=size-i&&k<size;j++,k++)//滑动窗口滑动
{
totalT+=satisfaction[k]*j;//累加价值
}
maxV = max(maxV,totalT);//比较总价值和最大价值,取大
}
return maxV;
}
};
方法二:动态规划
class Solution {
public:
int maxSatisfaction(vector<int>& satisfaction) {
int totalNum=0,res=0;
int size = satisfaction.size();
sort(satisfaction.begin(),satisfaction.end());
for(int i=size-1;i>=0;i--)
{
if(totalNum+satisfaction[i]<=0)//假如累加当前数的总和加上下一个数会变负,就可以结束了
{
return res;
}else//否则就累加
{
totalNum += satisfaction[i];//更新totalNum
res += totalNum;//更新res
}
}
return res;
}
};