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 太空电梯