P2365 任務安排 batch 動態規劃

2022-05-12 21:36:07 字數 3150 閱讀 2571

batch

★☆   輸入檔案:batch.in   輸出檔案:batch.out   簡單對比

時間限制:1 s   記憶體限制:128 mb

題目描

n個任務排成乙個序列在一台機器上等待完成(順序不得改變),這

n個任務被分成若干批,每批包含相鄰的若干任務。從時刻

0開始,這些任務被分批加工,第

i個任務單獨完成所需的時間是ti

。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以乙個費用係數fi

。請確定乙個分組方案,使得總費用最小。

例如:s=1;t=;

f=。如果分組方案是、、

,則完成時間分別為

,費用c=

,總費用就是

153。

輸入格式

第一行是n(1<=n<=5000)。

第二行是s(0<=s<=50)。

下面n行每行有一對數,分別為ti和fi,均為不大於100的正整數,表示第i個任務單獨完成所需的時間是ti及其費用係數fi。

輸出格

乙個數,最小的總費用。

輸入樣51

1 33 2

4 32 3

1 4輸出樣

額  哇哇哇  dp寫掛了 qaq

正解1   

f[i]   前i個任務的最優結果

f[i]=min

好東西呢 唉 qaq

詳細題解如下:

暴力方法

由於每一批任務連續,所以預處理出兩個字首和陣列:

sumt[i] 表示

執行前i個任務所需要的時間 , 即t[1]+t[2]+...+t[n]

sumc[i] 表示

不乘時間時,執行前i個任務所需要的費用 , 即c[1]+c[2]+...+c[n]

dp子狀態:

dp[i][j] 表示 前i個任務分成j批所需要的最小費用。

於是可以由dp[k][j-1]推出dp[i][j]:

dp[i][j]=min

時間複雜度o(n^3),

空間複雜度o(n^2)。

略微優化

暴力方法的dp子狀態空間是二維的,由於n <= 10000 ,所以考慮將二維狀態降到一維。

將第一維去掉的想法不太實際,故考慮將第二維去掉。

首先思考所有任務都放到同一批中,觀察每個任務需要等待s時間的次數:

任務編號 1  2  3  ...  n

等待次數 1  1  1  ...  1

當將1~pos1分成乙個區間時,每個任務需要等待的次數變為:

任務編號 1  2  3  ...  pos1  pos1+1  ...  n

等待次數 1  1  1  ...   1      2     ...  2

(如果仍然看不出來,可以再分幾次找找規律)

觀察等待次數:每次多分出乙個區間,區間左端點到n都需要多等待一次s時間。

故可以推出乙個新的方程:

dp[i]=min+sumt[i]*sumc[i+s*sumc[n]

去掉min函式,把dp[j]和sumc[j]看作變數,整理出dp[j]關於sumc[j]的一次函式(重要!):

dp[j]=(s+sumt[i]) * sumc[j] + (dp[i]-sumt[i]*sumc[i]-s*sumc[n])

y  =    k       *    x    +                 b

其中sumc[j]是自變數,dp[j]是因變數,s+sumt[i]是斜率,後面一串為截距。

建立乙個平面直角座標系:

每個決策j的二元組(sumc[j] , dp[j])表示座標系中的點。

當前狀態dp[i]表示直線的截距(且這條直線斜率為s+sumt[i])。

令直線過每個點可以得到解出截距,使截距最小的就是最優決策。

如圖:

討論三個決策點j1,j2,j3(j1

第一種情況:上凸。用眼睛觀察(hhh)可知,j2此時不可能成為最佳決策點,故放棄。

第二種情況:下凹。此時j2有可能成為最佳決策點。

最後把所有可能成為最佳決策點的j處理出來,即維護乙個相鄰點斜率單調遞增的「凸殼」。

其中最佳決策點左端斜率

又因為s+sumt[i]是單調遞增的,所以可以用單調佇列找第乙個右端斜率》s+sum[i]的點。

總時間複雜度:迴圈遞推o(n)+單調佇列o(n)=o(n)。

空間複雜度:一維狀態

o(n)。

#include typedef 

long

long

ll;typedef

double

db;const

int n=1e6+10

;int

n,s,s[n],t[n],q[n],head,tail;

ll dp[n],val[n];

db k(

int j,int k)

intmain()

q[head=tail=1]=0

;

for (int i=1;i<=n;i++)

printf(

"%lld\n

",dp[n]);

return0;

}

n^2暴力ac!

#include#define maxn 5005

using

namespace

std;

intt[maxn],f[maxn],sumt[maxn],sumf[maxn],dp[maxn];

intmain()

return0;

}

P2365 任務安排

n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這 n個任務被分成若干批,每批包含相鄰的若干任務。從零時刻開始,這些任務被分批加工,第 i個任務單獨完成所需的時間為 ti 在每批任務開始前,機器需要啟動時間 s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務將在同一時刻完成 每...

P2365 任務安排 題解

p2365 任務安排 這道題有弱化版和強化版,這道題是弱化版 我們很容易能想到乙個 dp 方程 f p i 表示前 i 個取了 p 段的最優解,於是轉移方程 f p i min f p 1 j st i p ast s ast sf i sf j 這個轉移方程是 o n 3 的考慮怎麼優化 對於每次...

動態規劃 洛谷P2365 任務安排

n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務將在同一時刻完成 每個任務的...