问题描述:
在一台超级计算机上,编号为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; }