NKOI 1047 任務安排

2021-07-13 11:07:13 字數 1537 閱讀 4879

任務安排

time limit:1000ms  memory limit:65536k

total submit:143 accepted:70

description

n個任務排成乙個序列在一台機器上等待完成(順序不得改變),這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和(同一批任務將在同一時刻完成)。每個任務的費用是它的完成時刻乘以乙個費用係數fi。請確定乙個分組方案,使得總費用最小。 

例如:s=1;t=;f=。如果分組方案是、、,則完成時間分別為,費用c=,總費用就是153。 

input

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

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

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

output

乙個數,最小的總費用。 

sample input

5

11 3

3 24 3

2 31 4

sample output

153

首先我們知道這是一道動態規劃題,用變數j來表示將j+1到i個人分在一組

但是我們會發現,當前每一步的決策都會對以後的決策造成影響,也就是說,討論到當前這個j的時候如果答案最優,那麼它將會更新後面計算的答案

因此我們考慮在計算時就考慮進去以後的計算,即用f[i]表示(完成工作1到i的費用)+(因增加了s導致的後面的工作增加的費用)的總和的最小值

由於我們要計算的時連續的一段區間,我們可以將輸入的陣列用字首和記錄

t[i]表示工作1到i的時間的累加(字首和);

f[i]表示工作1到i的費用係數的累加(字首和)。

f[i]=min

j用來分組,表示把工作j+1到工作i分到同一組中。

t[i]*(f[i]-f[j]) 表示完成j+1到i這一組工作的費用

s*(f[n]-f[j])表示因為增加了一次開機,導致從工作j+1到工作n增加的費用。

注意這裡的f[i]是計算了對i以後的決策造成的影響,但是最終答案仍然是f[n],這是因為n就是所有狀態的最後乙個,不存在「以後的狀態」這一問題

#include#includeusing namespace std;

const int inf=1e9;

int f[5005],s,t[5005],n;

int f[5005];

int main()

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

for(j=0;j<=i;j++)

f[i]=min(f[i],f[j]+t[i]*(f[i]-f[j])+s*(f[n]-f[j]));

cout<

Tyvj1098 任務安排

恕我懶 分析 本蒟蒻只想到了辣雞做法 f i,j 表示前j個任務分了i組,最少費用,f i,j min 發現這是o n 3 的,水不過去.於是腦洞大開想寫乙個二維的斜率優化.不知道為什麼一直wa了乙個點.於是去尋找正解,發現只需要開1維陣列就夠了,驚呆我了.用f i 表示從第i個任務開始做的最小費用...

TYVJ 1098 任務安排

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

IOI2002 任務安排

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