题目
N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。
输入
第1行:1个数N,表示作业的数量。(2 <= N <= 50000)
第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上加工所需的时间a[i], b[i]。(1 <= a[i], b[i] <= 10000)。输出
输出完成所有作业所需的最少时间。
输入样例
4
3 7
2 1
1 1
4 2输出样例
14
思路:两机器的单车间调度问题,使用 Johnson 法则解决即可
源程序
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 100000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
struct Node{
int num;
int id;
bool operator < (const Node &rhs)const{
return num<rhs.num;
}
}m[N];
int a[N],b[N];
int res[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=n;i++){
m[i].num=min(a[i],b[i]);
m[i].id=i;
}
sort(m+1,m+1+n);
int head=0,tail=n+1;
for(int i=1;i<=n;i++){
int num=m[i].num;
int id=m[i].id;
if(num==a[id])
res[++head]=id;
else
res[--tail]=id;
}
int timeA=0,timeB=0;
for(int i=1;i<=n;i++){
timeA+=a[res[i]];
if(timeB<timeA)
timeB=timeA;
timeB+=b[res[i]];
}
printf("%d\n",timeB);
return 0;
}