题目链接:http://poj.org/problem?id=2393
题意:奶牛们有一个工厂用来生产奶酪,接下来的N周时间里,在第i周生产1 单元的奶酪需要花费ci,同时它们也有一个储存室,奶酪放在那永远不会坏,并且可以无限放,每一单元奶酪放在那的价格恒定为每周s。然后奶牛在第i周会交付顾客yi的奶酪,让你求最小花费。
分析:这个题嘛,显然是贪心的,首先我们先不考虑数量来考虑价格,首先有一个想法是:我们更新这一周和下一周的费用,如果这一周的费用+存储费<下一周生产费用,那么就把下一周生产了。 似乎是可行的,但是如果给的价格的数据是这样的,存储费S是5,造价一次是63,89,97,73,72怎么办?显然就不对了,仔细一想,如果我们把这一周的造价+S与下一周的造价进行比较,如果小于就更新下一周的费用,让下一周造价等于这一周的造价+S。即 if(cost[i]+S<cost[i+1])cost[i+1]=cost[i]+S直到大于了下一周造价,ok,不更新,从下一周继续上面的操作。当当当当~~
code:
#include<cstdio>
const int MAXN=10000+5;
int cost[MAXN],num[MAXN];
int main(void){
int N,S;scanf("%d%d",&N,&S);
for(int i=0;i<N;++i)
scanf("%d%d",cost+i,num+i);
long long res=0;
for(int i=0;i<N;++i){
if(cost[i]+S<cost[i+1])cost[i+1]=cost[i]+S;//更新下一周
res+=cost[i]*num[i];//计算这一周
}
printf("%lld\n",res);
}