问题描述
样例输入输出
问题分析
这道题跟以前老师布置的卖卡车问题很像,但是这里要更简单一些,因为仓库认为是无限大的。
问题描述的就是,我现在要卖酸奶,但是未卜先知如我已经知道了接下来的n个星期每个星期要卖出多少酸奶(题中的Y_i),现在呢我有两种选择:
- 这周需求多少,我就这周生产多少,生产完了马上就卖。这样一来cost=C_i*Y_i
- 我已经事先知道了每周会卖多少酸奶,那么在以前多生产一点,留到这周再卖出(反正题目说了不会坏仓库还大万一省钱呢嘿嘿嘿)
需要留意的是第二种情况,我最开始写那个卖卡车问题想的就更多一些,当时的想法极端一些就是:第一周就把接下来所有的订单全部搞定囤到仓库里,然后接下来就只要卖就好了。这是极端的情况,说白了就是这周的酸奶并不一定来自本周或上周,它可以来自上上周、上上上周、上上上上。。。。(果然酸奶不会坏放飞了我的想象力)
但是其实不用想那么复杂,为什么呢?毕竟上面所列的两种情况是要进行比较的,也就是看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的才行,果然没卖过酸奶脑子里就对要花多少钱一点概念都没有,是我贫穷了。
我竟然对这道题比对卖卡车的题还要上心,我还是不适合当老司机我去喝酸奶好了。