P2365 任務安排 題解

2022-05-16 15:59:46 字數 1161 閱讀 7425

p2365 任務安排

這道題有弱化版和強化版,這道題是弱化版

我們很容易能想到乙個\(dp\)方程\(f[p][i]\)表示前\(i\)個取了\(p\)段的最優解,於是轉移方程

\[f[p][i]=min(f[p-1][j]+(st[i]+p\ast s)\ast (sf[i]-sf[j]))

\]這個轉移方程是\(o(n^3)\)的考慮怎麼優化

對於每次轉移時間都要加上乙個\(p\)我們提前記錄下\(p\)的費用

在每一次轉移方程時能預判到後面\(j-n\)的時間都要加上\(p\)

於是轉移方程就能化到\(o(n^2)\)了,可以過了

\[f[i]=min(f[j]+st[i]\ast (sf[j]-sf[i])+s \ast (sf[n]-sf[j]))

\]但是僅僅優化到這裡是不夠了

觀察到可以用斜率優化來優化到\(o(n)\)

轉化一下式子

\[(s+st[i])\ast sf[j]+(dp[i]-st[i]\ast sf[i]- s\ast sf[i])=(dp[j])

\]觀察到\(s+st

while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}int main()

printf("%d\n",dp[n]);

return 0;

}\(o(n)\)

#includeusing namespace std;

typedef long long ll;

const int maxn=10005;

int n,s,s_f[maxn],s_t[maxn],hed=1,til,f[maxn],q[maxn];

inline int read()

while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}int x(int j)

int y(int j)

long double calc(int i,int j)

int main()

printf("%d\n",f[n]);

return 0;

}

P2365 任務安排

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

P2365 任務安排 batch 動態規劃

batch 輸入檔案 batch.in 輸出檔案 batch.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 題目描述 n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這 n個任務被分成若干批,每批包含相鄰的若干任務。從時刻 0開始,這些任務被分批加工,第 i個任務單獨完成所需...

動態規劃 洛谷P2365 任務安排

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