Yogurt factory
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8497 | Accepted: 4346 |
Description
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.
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.
Input
* 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.
* Lines 2..N+1: Line i+1 contains two space-separated integers: C_i and Y_i.
Output
* 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.
Sample Input
4 5 88 200 89 400 97 300 91 500
Sample Output
126900
Hint
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.
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.
题意:
有一个奶酪工厂,给出这个工厂每天加工每个奶酪需要的价格,以及每天的需求量,另外,奶酪也可以存放在仓库里(竟然放不坏!),给出每个奶酪存放一天需要的价格,问,这些生产任务全部完成,最少的花费是多少
题解:
刚开始做这道题的时候,感觉自己想的太多了,需要对每天都计算是当天生产最划算还是其他天生产最划算,连优先队列都用上了.........
后来写着写着发现有更简便的方法了,完全可以在线性时间内完成运算!
贪心策略:
1,第一天的奶酪只能当天生产,这是无法贪心选取的,暂时假设以后的奶酪全在这一天生产
2,第二天的话,就要考虑是前一天生产存放到第二天还是第二天再生产呢?这就需要比较了,如果当天生产比较省钱,那么就当天生产!而且假设以后的所有奶酪都在这天生产的!为何这样呢?因为题目给出的奶酪存放的需要的价格完全一样!(细细想想看)
3,哪天生产更廉价,就哪天生产,这就要求对每天进行编号了。这样才能进行定量计算和查找最优解
另外注意,用64位的整数,个人一个马虎,WA 了一次,好在对自己的贪心思路比较自信,改了一下,果断提交,A掉!
/*
http://blog.csdn.net/liuke19950717
*/
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll;
struct node
{
ll p,num,id;//价格,数量,编号
}x[10005];
ll slove(ll n,ll s)
{
ll ans=x[0].p*x[0].num,kase=0;
for(ll i=1;i<n;++i)
{
ll tp=x[kase].p+s*(i-x[kase].id),cur=x[i].p;//一个是之前生产的实际价格,一个是当天生产的价格
if(tp<cur)//如果之前生产划算
{
ans+=tp*x[i].num;
}
else
{
ans+=cur*x[i].num;
kase=i;
}
}
return ans;
}
int main()
{
ll n,s;
while(~scanf("%lld%lld",&n,&s))
{
for(ll i=0;i<n;++i)
{
scanf("%lld%lld",&x[i].p,&x[i].num);
x[i].id=i;
}
printf("%lld\n",slove(n,s));
}
return 0;
}