【算法学习】【贪心算法】poj 2393:Yogurt factory

问题描述

在这里插入图片描述

样例输入输出

在这里插入图片描述

问题分析

这道题跟以前老师布置的卖卡车问题很像,但是这里要更简单一些,因为仓库认为是无限大的。
问题描述的就是,我现在要卖酸奶,但是未卜先知如我已经知道了接下来的n个星期每个星期要卖出多少酸奶(题中的Y_i),现在呢我有两种选择:

  1. 这周需求多少,我就这周生产多少,生产完了马上就卖。这样一来cost=C_i*Y_i
  2. 我已经事先知道了每周会卖多少酸奶,那么在以前多生产一点,留到这周再卖出(反正题目说了不会坏仓库还大万一省钱呢嘿嘿嘿)

需要留意的是第二种情况,我最开始写那个卖卡车问题想的就更多一些,当时的想法极端一些就是:第一周就把接下来所有的订单全部搞定囤到仓库里,然后接下来就只要卖就好了。这是极端的情况,说白了就是这周的酸奶并不一定来自本周或上周,它可以来自上上周、上上上周、上上上上。。。。(果然酸奶不会坏放飞了我的想象力)
但是其实不用想那么复杂,为什么呢?毕竟上面所列的两种情况是要进行比较的,也就是看C_i和C_i-1+S究竟谁更小。(单纯一点不考虑那么多星期,就只考虑眼下这周和上一周)
显然,如果C_i更小的话,C_i理所当然的就是第i周的生产费用;但如果C_i-1 +S更小的话,那就把C_i-1 +S当作是C_i也就是第i周的费用就好了。这样,就算有上面的情况:上上周,上上上周。。。便宜的价格也是会继承下来的。
于是选到了较小的C_i, 那么费用也就是C_i*Y_i 啦!

下面贴个代码:

#include<iostream>
using namespace std;
int C[10000];//每周生产一单元酸奶的费用
int Y[10000];//每周酸奶的需求量
long long minCost(int N, int S)
{
	long long totalCost = C[0] * Y[0];//第0周的费用肯定为当周需求量×生产费用

	for (int i = 1; i < N; i++)
	{
		//判断是当周生产更便宜,还是直接用上周在仓库中的酸奶更便宜
		//同时更新本周的费用
		C[i] = C[i] < (C[i - 1] + S) ? C[i] : (C[i - 1] + S);
		totalCost += C[i] * Y[i];
	}
	return totalCost;
}
int main()
{
	int n;//n周
	int s;//每单元酸奶每周存放在仓库里的费用s
	cin >> n >> s;
	for (int i = 0; i < n; i++)
	{
		cin >> C[i] >> Y[i];
	}
	cout << minCost(n, s);
	return 0;
}

ERROR汇总

老是WA啊就找原因啊,结果发现啊,一开始totalCost设的是long类型的,这家伙还得是 long long的才行,果然没卖过酸奶脑子里就对要花多少钱一点概念都没有,是我贫穷了。

我竟然对这道题比对卖卡车的题还要上心,我还是不适合当老司机我去喝酸奶好了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值