描述
-
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.
来源
USACO 2005 March Gold
题目意思:
一个生产酸奶的工厂,每天生产的量是任意的,但牛奶的原料的价格是波动的,如88 89 97,有固定的存储成本S,
每天运输的量也是给定的,如200,400,300, 500等等。
让你设计一个方案让生产和存储的成本最小。
思路:
贪心法去解,只考虑相邻两天的价格差值,这个价格差值可以设计为第一天的牛奶成本 和第二天的成本加存储价格 的差值,若差值小于0
让酸奶在第一天生产,否则在第二条生产。
实现:
实现起来简单的考虑即可,自己之前写的太复杂。
由于只考虑相邻的天,可以在读入的时候进行计算,设一个变量 min 用来保存上一次(第一天)的成本价格,若min + S(存储价格)< 当前的
cost,就把当前的cost 设为min + S ,进行求和计算,记住最后更新 min。
AC code:
#include<iostream>
#include<vector>
using namespace std;
int main(){
//freopen("C.txt","r",stdin);
int cost,t;
long long total_cost = 0;
long N,S;
cin >> N >> S;
int cur_c;
int min = 10000;
while(N--){
cin >> cost >> t;
if(cost > min + S) cost = min + S;
total_cost += cost * t;
min = cost ;
}
cout<<total_cost<<endl;
return 0;
}