码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1680: [Usaco2005 Mar]Yogurt factory

时间:2017-10-27 15:38:23      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:参考   href   dash   log   bzoj   center   www   lld   保存   

【传送门: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

标签:参考   href   dash   log   bzoj   center   www   lld   保存   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!