BZOJ1680: [Usaco2005 Mar]Yogurt factory
阿新 • • 發佈:2017-10-27
for 需要 mda 得出 最小值 logs 可能 dash +=
【傳送門: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