第二周学习总结
贪心算法:寻找最优解!
月饼
先给定所有种类月饼的库存量,总售价以及市场的最大需求量,试计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如有三种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45 亿元。如果市场的最大需求量只有20万吨,那么最大收益策略应该是卖出全部15万吨第二种月饼以及5万吨第三种月饼,获得72+45/2= 94.5 (亿元)。输入格式每个输入包含1个测试用例。每个测试用侧选给出一个不超过1000 的正整数N表示月饼的种类数以及不超过500 (以万吨为单位)的正路数D表示市场最大满求量:随后一个绘出N个正数表示每种月饼的库存量(以万吨为单位):最后行给出N个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。输出格式对每组测试用例,在行中输出最大收益,以亿元为单位并精确到小数点后两位。
输入样例
3 20
18 15 10
75 72 45
输出样例
94.50
思路:选择单价最高的月饼出售,获得最大利润
#include <bits/stdc++.h>
using namespace std;
struct mooncake{
double store;
double sell;
double price;}cake[1010];
bool cmp(mooncake a,mooncake b)
{ return a.price>b.price;}
int main()
{ int n; double D; scanf("%d%lf",&n,&D);
for(int i=0;i<n;i++)
{ scanf("%lf",&cake[i].store); } for(int i=0;i<n;i++)
{ scanf("%lf",&cake[i].sell); cake[i].price=cake[i].sell/cake[i].store; }
sort(cake,cake+n,cmp);
double ans=0;
for(int i=0;i<n;i++)
{ if(cake[i].store<=D){D-=cake[i].store; ans+=cake[i].sell;} else {ans+=cake[i].price*D; break;} }
printf("%.2f\n",ans);
return 0;}
奶牛吃花🌸
有n头奶牛跑到F的花园里去吃花了,它们分别在距离牛圈T分钟处吃花,每分钟会吃掉D朵卡哇伊的花儿。现在要将它们给弄回牛圈,但是他每次只能弄一头回去,来回用时总共为2*T分钟,在这段时间内,其它的奶牛会继续吃F1卡哇伊的花儿,速度保持不变,当然正在被赶回牛圈的奶牛就没口福了!现在要求以一种最棒的方法来尽可能的减少花的损失数量,求奶牛吃掉花的最少朵数!
该题与背包问题类似,都不能直接从距离或吃花数上求解。要将吃花数与时间结合起来(相当于背包问题的性价比)
组个最小数
给定数字0-9各若干个。可以任意顺序排列这些数字,但必须全部使用。目标是使得最后的得到的数尽可能小。例如,给定两个0,两个1,三个5.和一个8,得到的最小的数就是10015558。
首先组成的数字的首位不能为零!从1-9中选择不为零的最小数输出,然后从0-9输出数字,每个数字输出次数为其剩余个数
#include <cstdio>
using namespace std;
int main()
{
int count[10];
for(int i=0;i<10;i++)
{
scanf("%d",&count[i]);
}
for(int i=1;i<10;i++)
{
//从1~9中选择count不为零的最小数字
if(count[i]>0)
{
printf("%d",i);
count[i]--;
break;
}
}
for(int i=0;i<10;i++){//从0-9输出对应个数的数字
for(int j=0;j<count[i];j++){printf("%d",i);}
}return 0;
}
贪心算法最难的地方就是寻找最优解。当我们解出一道题时,首先要判断该题是否适合用贪心算法,我们可以按照最初的思路解题,当我们在解题的过程中可能就会发现最优策略并加以修改!