洛谷 任務安排

2021-09-11 08:02:42 字數 1751 閱讀 4520

初見安~這裡是傳送門:洛谷p2365

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

11 3

3 24 3

2 31 4

輸出樣例:

153
時間,費用,求最小——很像揹包對不對!差不多了。往dp的方向想就對了。

這道題如果我們用貪心的演算法的話,會有很多細節要處理,而且**量相對而言也有點長【關鍵是還全錯】,所以我們就不能考慮了。(我一開始就用的接近於貪心的演算法然後樣例輸出153我輸出了154……)

dp 的話**量其實很短——我們可以看到:時間實在累計的,而每一批的任務所用的費用是所有的係數乘這一批完成時的時間點,都是需要累加的量,所以我們存的時候就累加存:

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

現在來考慮核心**:如果我們去考慮要怎麼分批的話,那就麻煩了——不說你也知道。這就是dp的巧妙之處了——

我們假設,算任務1~i(i<=n)的最小費用時,如果從第j(1<=jdp時的兩種方案:

1.不變

2.從任務j開始分批,則:

也就是說:本著dp[ i ]值的改動不影響dp[ j ]的原則,分批的話在這一步操作中是分為了三部分:任務1~j,值就是dp[ j ];任務j~i,就是完成任務i的時間點乘以這一堆任務的費用係數和(乘法分配律);任務i~n的值會因為j點強行分批而導致不得不多乙個開機時間,所以要加上(是加上不是重新算。在dp[ j ]中後面的原情況已經存在了,只需要做一點改動)。也就是以上的三部分了。

*注意:

1.後值不影響前值。

2.點j的意思是:新增乙個分割點,j以後的自動為一批。當然這裡的一批並不一定是說最後分完了就只有3批,在取用dp[ j ]的時候其實就已經可以看出分了很多批了——因為算dp[ j ]的時候同樣是這麼分出來的。同理。

大致就是如此啦——我們現在來看看**:)

#include#define maxn 50000+5

using namespace std;

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

int dp[maxn];

int main()

dp[0]=0;//需要初始化避免輸出極大值

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

{ for(register int j=0;j迎評:)

——end——

佇列安排 洛谷

思路 這個就是一道模擬二叉樹的題。反正我是這麼理解的。首先建立乙個結構體陣列,包含左孩子,右孩子,以及乙個變數用來標記後面他是否被刪除了。然後就是插入的時候先判斷p 根據題目 判斷完p之後還要判斷k的左右孩子。舉個栗子 比如說i為2,k為3,p為1.那麼現在2要往3的右邊插隊,你就首先要判斷3原先右...

動態規劃 洛谷P2365 任務安排

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

洛谷 P2365 任務安排 (線性dp)

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