POJ2393:Yogurt factory
2393:Yogurt factory
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the next N (1 <= N <= 10,000) weeks, the price of milk and labor will fluctuate weekly such that it will cost the company C_i (1 <= C_i <= 5,000) cents to produce one unit of yogurt in week i. Yucky's factory, being well-designed, can produce arbitrarily many units of yogurt each week.
Yucky Yogurt owns a warehouse that can store unused yogurt at a constant fee of S (1 <= S <= 100) cents per unit of yogurt per week. Fortuitously, yogurt does not spoil. Yucky Yogurt's warehouse is enormous, so it can hold arbitrarily many units of yogurt.
Yucky wants to find a way to make weekly deliveries of Y_i (0 <= Y_i <= 10,000) units of yogurt to its clientele (Y_i is the delivery quantity in week i). Help Yucky minimize its costs over the entire N-week period. Yogurt produced in week i, as well as any yogurt already in storage, can be used to meet Yucky's demand for that week. - 输入
- * Line 1: Two space-separated integers, N and S.
* Lines 2..N+1: Line i+1 contains two space-separated integers: C_i and Y_i. - 输出
- * Line 1: Line 1 contains a single integer: the minimum total cost to satisfy the yogurt schedule. Note that the total might be too large for a 32-bit integer.
- 样例输入
-
4 5 88 200 89 400 97 300 91 500
- 样例输出
-
126900
- 提示
- OUTPUT DETAILS:
In week 1, produce 200 units of yogurt and deliver all of it. In week 2, produce 700 units: deliver 400 units while storing 300 units. In week 3, deliver the 300 units that were stored. In week 4, produce and deliver 500 units. - 【题目大意】
有一个制作酸奶的工厂,需要在接下来的N(1<=N<=10000)周里
生产酸奶,第i周的成本为Ci(1<=Ci<=5000),工厂有一个无限大的仓库可
以存储生产好了的酸奶,并且这些酸奶不会过期,可以一直存储,但是存
储每单位酸奶每周要花费S(1<=S<=100)。计算:要满足条件:工厂第i周必
须送出Yi(1<=Yi<=10000)单位的酸奶(可以从仓库中送出,也可以本周生产),
最小花费是多少?【样例说明】:第一周生产200单位酸奶并且全部送出;第二周,生产700单位:送出400,存储300; 第三周,送出第二周存储的300单位; 第四周,生产500单位并全部送出。
【题目分析】 第i周的酸奶可以是任意小于i的周生产的。于是如果第i周的酸奶在第j(i>j)周生产,相当于这酸奶在第j周生产,并且花费是第i周的成本加上(i-j)周的储存费用。
第i周的最小花费是可以由第i-1周的最小花费推出的:mincost(i) = min( mincost(i-1)+s,Ci );而第一周的最小成本就是C1,因为第一周的酸奶只能第一周生产。
于是从第一周开始可以逐步推出所有周的最小花费:
1 for( int i=1; i<=N-1; i++ ) { 2 week[i].C = min( week[i-1].C+S,week[i].C ); 3 //i推i+1,到N-1时就已经推出N了 N单独处理就行了 4 }
关于数据范围:最坏的情况是,有10000周,每周都需要送出10000单位酸奶,
并且每周的成本都是5000.在这种情况下,共需要10000*5000*10000=5e+11的花费。
所以使用long long 就可以了。【代码】
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 10010; 6 7 struct _week 8 { 9 int C; 10 int Y; 11 }; 12 _week week[maxn]; 13 int N,S; 14 15 int main() 16 { 17 cin >> N >> S; 18 long long totalcost = 0; 19 for( int i=1; i<=N; i++ ) { 20 cin >> week[i].C >> week[i].Y; 21 } 22 23 //推出2到N-1周的最小花费同时计算总费用 24 for( int i=1; i<=N-1; i++ ) { 25 totalcost += week[i].C * week[i].Y; 26 week[i+1].C = min( week[i].C+S,week[i+1].C ); 27 } 28 29 //总费用加上最后一周(第N周)的花费 30 totalcost += week[N].C * week[N].Y; 31 cout << totalcost << endl; 32 return 0; 33 }
上一篇:【POJ3752:走迷宫】https://www.cnblogs.com/pkuqcy/p/14919878.html
下一篇:【POJ4151:电影节】https://www.cnblogs.com/pkuqcy/p/14969720.html