Title:酸奶工厂
Description
奶牛经营了一家酸奶工厂,生意非常红火。在接下去的 N 个月里,第 i 个月需要向社会提供 A i 吨酸奶。酸奶的生产受到很多因素的影响,所以每个月的生产成本是变化的,其中第 i 个月的成本是 每吨 C i 元。
奶牛可以提前里把酸奶做好,存在仓库里,等需要的时候再拿出来卖。存储在仓库里的酸奶,每 吨酸奶存放一个月需要支付 S 元的维护费用,存放的时间可以任意长。假设工厂的产量是无限的,存 储酸奶的仓库也是无限大的。请问为了满足订单的需要,奶牛生产这些酸奶最少要花多少钱?
Input Format
- 第一行:两个整数 N 和 S,1 ≤ N ≤ 10000, 1 ≤ S ≤ 100
- 第二行到第 N + 1 行:第 i + 1 行有两个整数 C i 和 A i ,1 ≤ C i ≤ 5000, 1 ≤ A i ≤ 10000
Output Format
单个整数:表示生产酸奶的最小总费用
Sample Input
4 5
88 200
89 400
97 300
91 500
Sample Output
126900
Hint
第一个月生产 200 吨酸奶;第二个月生产吨酸奶,并存下 300 吨;第三个月不生产酸奶;第三个月生产 500 吨
Source
Yogurt factory, USACO 2005 Mar
Analysis
算法:贪心
简析:当第i月的酸奶保存到第j月的单位维护费+单位成本(i<=j)小于第j月的单位成本,则选取i月的酸奶填充j月较优
当第i月的酸奶保存到第j月的单位维护费+单位成本(i<=j)大于等于第j月的单位成本,则用第j月的酸奶来填充之后月份的酸奶会比用第i月的 更优【因为成本已经固定,每月的维修费是一样的】(i<j<=k)
做法:用now记录前i-1个月的最优单位费用(每个月累加s),若比第i月的单位费用大则替换。 计算入答案
注意:now和ans可能超出longint范围,使用long long
复杂度:O(n)
Code
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-family:SimHei;font-size:18px;">//USACO 酸奶工厂 贪心
//错误:1: 数据范围,now,ans(long long)
//错误 2: long long输出时是lld
#include<cstdio>
int n,s,c,a;
long long now=10000000,ans=0;
int main()
{
scanf("%d%d",&n,&s);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&c,&a);
if (now>c) now=c;
ans+=now*a;
now+=s;
}
printf("%lld",ans);
return 0;
}</span></span></span>