本文主要是介绍贪心算法解做菜顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
贪心算法解做菜顺序(笔记)
来源 :LeetCode第1402题
难度:困难
一个厨师收集了他n
道菜的满意程度satisfaction
,这个厨师做出每道菜的时间都是1
单位时间。
一道菜的「喜爱时间」
系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是time[i]*satisfaction[i]
。
请你返回做完所有菜「喜爱时间」总和的最大值为多少。
你可以按任意顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。
贪心算法解决
在这题中每道菜的喜爱时间是每道菜的满意度*之前花费的时间,比如数组[5,6,7]
,第一道菜的喜爱时间是1*5
,第二道菜的喜爱时间是2*6
,第三道菜的喜爱时间是3*7
。
但这题求的是最大值,并且还有负数,所以最简单的一种解决方式就是先对数组进行排序,我们从后往前开始计算,但这里有个问题,就是排序之后最后一道菜所花费的时间是多少,这里我们可以考虑使用后缀和,也就是从数组后面统计他们的和,这里以示例一为例画个图来看下
#include <stdio.h>
#include <stdlib.h>
void fun(int *array,int n){int i=0,j = 0;for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(array[j]>array[j+1]){int temp = array[j+1];array[j+1] = array[j];array[j] = temp;} }}
}
int fun_sum(int *array,int n){//传入排序后的数组 int i=0;int sum=0;int result=0;for(i=n-1;i>=0;i--){sum += array[i];if(sum<=0){return result;}result += sum;}return result;
}
void display(int array[],int n){int i=0;for(i=0;i<n;i++){printf("%d ",array[i]);}
}
int main() {int array[5] = {5,0,-9,-1,-8};int n=5;fun(array,n);display(array,n);printf("\n后缀和:%d",fun_sum(array,n));return 0;
}
这篇关于贪心算法解做菜顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!