奶酪工厂

接下来的N(1≤N10000)星期中,奶酪工厂在第i个星期要花C_i分来生产一个单位的奶酪。约克奶酪工厂拥有一个
无限大的仓库,每个星期生产的多余的奶酪都会放在这里。而且每个星期存放一个单位的奶酪要花费S分。工厂最
近收到了客戶N个星期的订单,第i个星期要向客戶提供Y_i 个单位的奶酪。当然这些奶酪可以在第i个星期时生产
,也可以从仓库中拿取。采用怎样的生产策略约克奶酪工厂的花费最小呢?
Input
第一行两个整数:N和S;接下来的N行中,第i行的两个数表示:C_i和Y_i。
Output
仅一行,即工厂生产的最小花费
Sample Input
4 5
88 200
89 400
97 300
91 500
Sample Output
126900

Sol:分析第i月奶酪的价格,它有两种情况,一是第i个月自己生产,二是由1~i-1个月中某个月的奶酪价格+存储费用保留下来。如下面的样例,设第i月价格为now

88 200   第一月自己生产,now=c[1]=88,计算后now更新为now+s,now=93,看下个月是否用这个价格生产。
89 400   now>c[2],即93>89,所以第2月自己生产,now=89,计算后now更新为94。
97 300   now<c[3],即94<97,所以第3月用上月的价格生产存储,now=94,计算后now更新为99。
91 500   now>c[4],即99>91,所以第4月自己生产,now=91。

由上可知,贪心策略根据条件选择,如果上月的价格+存储价格<当月自己生产价格,则选择前面某月生产存储,否则当月自己生产。

 1 #include<cstdio>
 2 int n,s,c,a;
 3 long long now=10000000,ans=0;
 4 int main()
 5 {
 6     scanf("%d%d",&n,&s);//n个月,保管费用为s 
 7     for (int i=1;i<=n;i++)
 8     {
 9         scanf("%d%d",&c,&a);//当月的成本为c,需求量为a 
10         if (now>c) //如果从[1,i-1]这一段某个月生产的成本高于本月的 
11             now=c;//本月自己生产奶酪 
12         ans+=now*a;
13         now+=s;//累加储存成本 
14     }
15     printf("%lld",ans);
16     return 0;
17 }
posted @ 2020-01-03 11:47  蘑菇JJ  阅读(401)  评论(0编辑  收藏  举报