接下来的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 }