1. 程式人生 > >BZOJ1680: [Usaco2005 Mar]Yogurt factory

BZOJ1680: [Usaco2005 Mar]Yogurt factory

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