IOI2002 任務安排

2021-07-28 07:30:59 字數 1374 閱讀 9830

[ioi2002]任務安排

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。

乙個數,最小的總費用。

5

1 1 3

3 2

4 3

2 3

1 4

動態規劃 ,斜率優化

簡單的dp問題,可以考慮斜率優化等,但是因為資料不大o(n^2)也可以過的

考慮到對於每一種花費情況,顯然每乙個元件是否處於該批次只對其後面的元件有影響,於是可以考慮有字尾和記錄花費時間及代價,然後倒序更新dp值,最後答案在dp[1]上,注意初始化以及更新的範圍:

dp[n + 1] = 0;

for (int i = n; i >= 1; --i)

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

dp[i] = min(dp[i], dp[j] + sumf[i] * (sumt[i] - sumt[j] + s));

還可以用字首和處理,找到乙個o(n^3)的遞推關係式,然後加乙個斜率優化

#include #include #include #include #include #include #include #include #include #include #define l 5010

#define inf 1000000009

#define ll long long

using namespace std;

int n, s;

ll f[l], t[l], sumf[l], sumt[l], dp[l];

int main()

考試的時候考慮到了每乙個元件的影響範圍是取決於本組在該元件後的元件,所以有考慮用字尾陣列,大概算了算遞推公式和標程大概差不多,然而只剩下不到十分鐘了,於是……

後面看了下題解,但是一直沒有處理好初始化以及範圍的問題,後來受標程的啟發將初始值後移了一位就a了

題解 CJOJ1371 IOI2002 任務安排

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

NKOI 1047 任務安排

任務安排 time limit 1000ms memory limit 65536k total submit 143 accepted 70 description n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批...

Tyvj1098 任務安排

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