問題描述:
在一台超級計算機上,編號為1,2, , n 的 n 個作業等待批處理。批處理的任務就是將
這 n 個作業分成若干批,每批包含相鄰的若干作業。從時刻 0 開始,分批加工這些作業。在
每批作業開始前,機器需要啟動時間 S ,而完成這批作業所需的時間是單獨完成批中各個作
業需要時間的總和。單獨完成第i 個作業所需的時間是 i
t ,所需的費用是它的完成時刻乘以
一個費用系數 i
f 。同一批作業將在同一時刻完成。例如,如果在時刻T 開始一批作業
x x x k , 1, , ,則這一批作業的完成時刻均為 1
( ) T S t t t x x x k 。最優批處理
問題就是要確定總費用最小的批處理方案。例如,假定有 5 個作業等待批處理,且
1 2 3 4 5 1 2 3 4 5 S t t t t t f f f f f 1,( , , , , ) (1,3, 4, 2,1),( , , , , ) (3, 2,3,3,4)
如果采用批處理方案{1,2},{3},{4,5},則各作業的完成時間分別為(5,5,10,14,14) ,各
作業的費用分別為(15,10,30, 42,56) ,因此,這個批處理方案總費用是 153。
算法設計:
對於給定的待批處理的n 個作業,計算其總費用最小的批處理方案。
數據輸入:
由文件 input.txt 提供輸入數據。文件的第 1 行是待批處理的作業數n , 第 2 行是啟動
時間 S 。接下來每行有 2 個數,分別為單獨完成第i 個作業所需的時間是 i
t 和所需的費用系
數 i
f 。
結果輸出:
將計算出的最小總費用輸出到文件 output.txt 中。
輸入文件示例 輸出文件示例
input.txt output.txt
5
1
1 3
3 2
4 3
2 3
1 4
153
【題解】
設dp[i]表示i..n這些作業完成花費的最少時間 則dp[i] = min(dp[j]+(f[i]+f[i+1]+..+f[n])(S+t[i]+t[i+1]+...+t[j-1])); 把i,i+1,i+2..j-1作為第一段 N^2的算法.O(N)的還是算了吧。。。【代碼】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10000;
const int M = 1e4;
int n,s;
int t[N+10],f[N+10];
int tt[N+10],ff[N+10];
int dp[N+10];
int main(){
//freopen("C://Users//Administrator//Desktop//測試數據//ch3//prog32//test//batch20.in","r",stdin);
cin >> n;
cin >> s;
for (int i = 1;i <= n;i++) cin >> t[i] >> f[i];
for (int i = n;i >= 1;i--){
tt[i] = tt[i+1] + t[i];
ff[i] = ff[i+1] + f[i];
}
dp[n+1] = 0;
for (int i = n;i >= 1;i--){
dp[i] = -1;
for (int j = i+1;j <= n+1;j++){
int temp = dp[j] + ff[i]*(s+tt[i]-tt[j]);
if (dp[i]==-1) dp[i] = temp;
else dp[i] = min(dp[i],temp);
}
}
printf("%d\n",dp[1]);
return 0;
}
