解题思路
这道题是Johnson双流水线调度算法的基础题。
本题是要求一个加工顺序使得总的加工时间最少,而要使加工时间最少,就是让各车间的空闲时间最少。一旦A车间开始加工,便会不停地进行加工(我们不要去管车间是否能够一直生产,因为他们有三班,可以24时间不停地运转)。关键是B车间在生产的过程中,有可能要等待A车间的初加工产品。很显然所安排的第一个产品在A车间加工时,B车间是要等待的,最后一个产品在B车间加工时,A车间已经完成了任务。
要使总的空闲时间最少:
(1)就要把在A车间加工时间最短的部件优先加工,这样使得B车间能以最快的速度开始加工;
(2)把放在B车间加工时间最短的产品放在最后加工,这样使得最后A车间的空闲时间最少。
#include <bits/stdc++.h>
#define _for(i,a,n) for(int i=a;i<n;++i)
#define rep(i,a,n)for(int i=a;i<=n;++i)
#define input() int T;cin>>T;while(T--)
#define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
template<class T>inline void read(T &x){bool Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
using namespace std;
const int maxn = 1e3;
struct node {
int id; //工作编号
int t; //工作时间
int ab; //所属哪台机器
inline bool operator < (const node &b) const {
return t < b.t;
}
node(int _id = 0,int _t = 0,int _ab = 0):id(_id), t(_t), ab(_ab){}
}arr[maxn + 5];
int n, a[maxn + 5], b[maxn + 5], ans[maxn + 5], ti[maxn + 5];
void Johnson()
{
rep(i, 1, n) {
if(a[i] < b[i]) arr[i] = node(i, a[i], 0);
else arr[i] = node(i, b[i], 1);
}
sort(arr + 1, arr + n + 1);
int l = 0, r = n + 1;
rep(i, 1, n) {
if(!arr[i].ab) ans[++l] = arr[i].id;
else ans[--r] = arr[i].id;
}
}
int main()
{
read(n);
rep(i, 1, n) read(a[i]);
rep(i, 1, n) read(b[i]);
Johnson();
rep(i, 1, n) ti[i] = ti[i - 1] + a[ans[i]];
int sum = ti[1] + b[ans[1]];
rep(i, 2, n) sum = max(sum, ti[i]) + b[ans[i]];
cout << sum << endl;
_for(i, 1, n) cout << ans[i] << " ";
cout << ans[n] <<endl;
return 0;
}