BZOJ1680: [Usaco2005 Mar]Yogurt factory

Posted Star_Feel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1680: [Usaco2005 Mar]Yogurt factory相关的知识,希望对你有一定的参考价值。

【传送门:BZOJ1680


简要题意:

  有一个工厂,工厂现在每个月都有一个生产任务要做,给出n个生产任务,每个任务给出需要的产品数和当前月份的产品单价,第i个生产任务在第i个月时完成,每个月生产产品的单价可能不一样,但是一个月生产无数的产品,假如当前月份的任务用不了那么多产品,就要放在仓库里保存,每一个的产品放置一个月就要消耗费用s,求出完成这n个任务的最小费用


题解:

  最近在刷USACO,但发现USACO上不去,在BZOJ勉强刷一波,但大部分是权限题,就只好用权限号了(没有权限号的蒟蒻——我)

  其实这就是贪心,用p数组来记录每个月的最小单价,那么怎么来维护这个数组呢,首先当我们处理p[i]的时候,一定保证p[i-1]的单价一定是最低的,于是我们就取p[i-1]+s和第i个月份的单价的最小值,得出来的值就是p[i]了,之所以+s,是因为保存一个月的话每一个的产品就要消耗费用s,其实相当于把单价+s,所以我们这么做是可行的,答案记得开long long!


参考代码:

#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\n",ans);
    return 0;
} 

以上是关于BZOJ1680: [Usaco2005 Mar]Yogurt factory的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 16801740 : [Usaco2005 Mar]Yogurt factory 贪心 双倍经验

bzoj1742[Usaco2005 nov]Grazing on the Run 边跑边吃草*&&bzoj3074[Usaco2013 Mar]The Cow Run*

BZOJ1740: [Usaco2005 mar]Yogurt factory 奶酪工厂

BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯

最小生成树BZOJ1682[Usaco2005 Mar]-Out of Hay 干草危机

BZOJ1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛