batch
★☆ 輸入檔案:batch.in 輸出檔案:batch.out 簡單對比
時間限制:1 s 記憶體限制:128 mb
題目描述
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。
輸出格式
乙個數,最小的總費用。
輸入樣例51
1 33 2
4 32 3
1 4輸出樣例
額 哇哇哇 dp寫掛了 qaq
正解1
f[i] 前i個任務的最優結果
f[i]=min
好東西呢 唉 qaq
詳細題解如下:
暴力方法
由於每一批任務連續,所以預處理出兩個字首和陣列:
sumt[i] 表示
執行前i個任務所需要的時間 , 即t[1]+t[2]+...+t[n]
sumc[i] 表示
不乘時間時,執行前i個任務所需要的費用 , 即c[1]+c[2]+...+c[n]
dp子狀態:
dp[i][j] 表示 前i個任務分成j批所需要的最小費用。
於是可以由dp[k][j-1]推出dp[i][j]:
dp[i][j]=min
時間複雜度o(n^3),
空間複雜度o(n^2)。
略微優化
暴力方法的dp子狀態空間是二維的,由於n <= 10000 ,所以考慮將二維狀態降到一維。
將第一維去掉的想法不太實際,故考慮將第二維去掉。
首先思考所有任務都放到同一批中,觀察每個任務需要等待s時間的次數:
任務編號 1 2 3 ... n
等待次數 1 1 1 ... 1
當將1~pos1分成乙個區間時,每個任務需要等待的次數變為:
任務編號 1 2 3 ... pos1 pos1+1 ... n
等待次數 1 1 1 ... 1 2 ... 2
(如果仍然看不出來,可以再分幾次找找規律)
觀察等待次數:每次多分出乙個區間,區間左端點到n都需要多等待一次s時間。
故可以推出乙個新的方程:
dp[i]=min+sumt[i]*sumc[i+s*sumc[n]
去掉min函式,把dp[j]和sumc[j]看作變數,整理出dp[j]關於sumc[j]的一次函式(重要!):
dp[j]=(s+sumt[i]) * sumc[j] + (dp[i]-sumt[i]*sumc[i]-s*sumc[n])
y = k * x + b
其中sumc[j]是自變數,dp[j]是因變數,s+sumt[i]是斜率,後面一串為截距。
建立乙個平面直角座標系:
每個決策j的二元組(sumc[j] , dp[j])表示座標系中的點。
當前狀態dp[i]表示直線的截距(且這條直線斜率為s+sumt[i])。
令直線過每個點可以得到解出截距,使截距最小的就是最優決策。
如圖:
討論三個決策點j1,j2,j3(j1
第一種情況:上凸。用眼睛觀察(hhh)可知,j2此時不可能成為最佳決策點,故放棄。
第二種情況:下凹。此時j2有可能成為最佳決策點。
最後把所有可能成為最佳決策點的j處理出來,即維護乙個相鄰點斜率單調遞增的「凸殼」。
其中最佳決策點左端斜率
又因為s+sumt[i]是單調遞增的,所以可以用單調佇列找第乙個右端斜率》s+sum[i]的點。
總時間複雜度:迴圈遞推o(n)+單調佇列o(n)=o(n)。
空間複雜度:一維狀態
o(n)。
#include typedefn^2暴力ac!long
long
ll;typedef
double
db;const
int n=1e6+10
;int
n,s,s[n],t[n],q[n],head,tail;
ll dp[n],val[n];
db k(
int j,int k)
intmain()
q[head=tail=1]=0
;
for (int i=1;i<=n;i++)
printf(
"%lld\n
",dp[n]);
return0;
}
#include#define maxn 5005using
namespace
std;
intt[maxn],f[maxn],sumt[maxn],sumf[maxn],dp[maxn];
intmain()
return0;
}
P2365 任務安排
n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這 n個任務被分成若干批,每批包含相鄰的若干任務。從零時刻開始,這些任務被分批加工,第 i個任務單獨完成所需的時間為 ti 在每批任務開始前,機器需要啟動時間 s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務將在同一時刻完成 每...
P2365 任務安排 題解
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 的考慮怎麼優化 對於每次...
動態規劃 洛谷P2365 任務安排
n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務將在同一時刻完成 每個任務的...