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

2021-08-17 00:01:41 字數 1701 閱讀 1692

3月14日第二題!!

題目描述

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

輸出樣例:

153一上來先把n^3寫出來

f[i][j] 表示前i個分j批的最小花費

code:

//by menteur_hxy

#include

#include

#include

#include

using

namespace

std;

const

int max=5010;

const

int inf=0x3f3f3f3f;

int n,s,minn=inf;

int ti[max],fi[max],f[max][max];

int main()

memset(f,0x3f,sizeof f);

f[0][0]=0;

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

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

}for(int i=1;i<=n;i++) minn=min(minn,f[n][i]);

printf("%d",minn);

return

0;}

n=5000,嗯好像過不了。

考慮公升級成n^2 發現可以把批數忽略掉

只需要提前加上後面多出的花費即可。

code:

//by menteur_hxy

#include

#include

#include

#include

using

namespace

std;

const

int max=5010;

const

int inf=0x3f3f3f3f;

int n,s;

int ti[max],fi[max],f[max];

int main()

memset(f,0x3f,sizeof f);

f[0]=0;

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

for(int j=0;jprintf("%d",f[n]);

return

0;}

搞定收工233~。

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

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

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

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

P2365 任務安排

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