0
点赞
收藏
分享

微信扫一扫

贪心算法解做菜顺序

醉东枫 2022-09-27 阅读 56


贪心算法解做菜顺序(笔记)

难度:困难

一个厨师收集了他​​n​​​道菜的满意程度​​satisfaction​​​,这个厨师做出每道菜的时间都是​​1​​单位时间。

一道菜的​​「喜爱时间」​​​系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是​​time[i]*satisfaction[i]​​。

请你返回做完所有菜「喜爱时间」总和的最大值为多少。

贪心算法解做菜顺序_i++

你可以按任意顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。

贪心算法解决
在这题中每道菜的喜爱时间是每道菜的满意度*之前花费的时间,比如数组​​​[5,6,7]​​​,第一道菜的喜爱时间是​​1*5​​​,第二道菜的喜爱时间是​​2*6​​​,第三道菜的喜爱时间是​​3*7​​​。
但这题求的是最大值,并且还有负数,所以最简单的一种解决方式就是先对数组进行排序,我们从后往前开始计算,但这里有个问题,就是排序之后最后一道菜所花费的时间是多少,这里我们可以考虑使用后缀和,也就是从数组后面统计他们的和,这里以示例一为例画个图来看下



贪心算法解做菜顺序_算法_02



贪心算法解做菜顺序_数组_03


#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;
}

贪心算法解做菜顺序_i++_04


举报

相关推荐

0 条评论