初見安~這裡是傳送門:洛谷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。
輸出格式:
乙個數,最小的總費用。
輸入樣例:
輸出樣例:511 3
3 24 3
2 31 4
時間,費用,求最小——很像揹包對不對!差不多了。往dp的方向想就對了。153
這道題如果我們用貪心的演算法的話,會有很多細節要處理,而且**量相對而言也有點長【關鍵是還全錯】,所以我們就不能考慮了。(我一開始就用的接近於貪心的演算法然後樣例輸出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,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務...