使用c++程序n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 输入格式: 第一行给出作业个数n(0<n<100) 第二行起的n行,每行两个数ai和bi 输出格式: 两个数字,以空格分隔,分别表示M1机器运行结束的时间和M2机器运行结束的时间。 输入样例: 6 30 80 120 100 50 90 20 60 90 30 110 10 输出样例: 420 430
时间: 2024-03-14 22:42:46 浏览: 60
以下是使用C++语言实现该问题的代码:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N], b[N], f[N][N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i] >> b[i];
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + b[i];
int res = 0x3f3f3f3f;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
if (i + j == n)
res = min(res, max(f[i][j], a[i + j]));
cout << res << ' ' << f[n][n] << endl;
return 0;
}
```
算法解析:
首先,我们需要一个二维数组 $f[i][j]$ 来表示前 $i$ 个作业在 M1 上加工,前 $j$ 个作业在 M2 上加工所需的最小时间。
对于每一个作业,存在两种选择:在 M1 上加工或在 M2 上加工。因此,我们可以通过转移方程求解 $f[i][j]$:
$$ f[i][j] = \min (f[i - 1][j],f[i][j - 1]) + b[i] $$
其中,$b[i]$ 表示第 $i$ 个作业在 M2 上加工所需的时间。
接下来,我们需要求出使得总时间最短的作业顺序。我们可以枚举 M1 和 M2 上各有多少个作业,然后计算出 M1 和 M2 的加工时间,最后取最小值,即为总时间的最小值。具体地,我们可以使用以下的代码实现:
```cpp
int res = 0x3f3f3f3f;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= n; j ++ )
if (i + j == n)
res = min(res, max(f[i][j], a[i + j]));
```
其中,$a[i]$ 表示第 $i$ 个作业在 M1 上加工所需的时间,$n$ 表示总共有多少个作业。
最后,输出 M1 和 M2 加工完成的时间即可。
阅读全文