BZOJ1680: [Usaco2005 Mar]Yogurt factory

【传送门:BZOJ1680


简要题意:

  奶牛经营了一家酸奶工厂,生意非常红火。在接下去的N 个月里,第i 个月需要向社会提供Ai 吨酸奶。酸奶的生产受到很多因素的影响,所以每个月的生产成本是变化的,其中第i 个月的成本是 每吨Ci 元。 奶牛可以提前里把酸奶做好,存在仓库里,等需要的时候再拿出来卖。存储在仓库里的酸奶,每吨酸奶存放一个月需要支付S 元的维护费用,存放的时间可以任意长。假设工厂的产量是无限的,存 储酸奶的仓库也是无限大的。请问为了满足订单的需要,奶牛生产这些酸奶最少要花多少钱?


输入格式:

  • 第一行:两个整数N 和S,1 ≤ N ≤ 10000, 1 ≤ S ≤ 100

  • 第二行到第N + 1 行:第i + 1 行有两个整数Ci 和Ai,1 ≤ Ci ≤ 5000, 1 ≤ Ai ≤ 10000


输出格式:

  • 单个整数:表示生产酸奶的最小总费用


样例输入:

4 5

88 200

89 400

97 300

91 500


样例输出:

126900


样例解释:

  第一个月生产200 吨酸奶;第二个月生产 700 吨酸奶,并存下300 吨;第三个月不生产酸 奶;第三个月生产500 吨


题解:

  贪心,p[i]表示第i个月的成本(包括存放的成本),那么我们在处理p[i]的时候,保证p[i-1]是最小成本,那么p[i]=min(p[i-1]+s,c[i])


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long LL;
int c[11000],a[11000],p[11000];
int main()
{
    int n,s;
    scanf("%d%d",&n,&s);
    for(int i=1;i<=n;i++) scanf("%d%d",&c[i],&a[i]);
    LL ans=0;
    p[0]=999999999;
    for(int i=1;i<=n;i++)
    {
        p[i]=min(p[i-1]+s,c[i]);
        ans+=p[i]*a[i];
    }
    printf("%lld
",ans);
    return 0;
}

 

原文地址:https://www.cnblogs.com/Never-mind/p/7742740.html