【问题】
某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 i 在 A,B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。【输入】
第一行仅—个数据 n ,表示产品的数量;
接下来 n 个数据是表示这 n 个产品在 A 车间加工各自所要的时间;
最后的 n 个数据是表示这 n 个产品在 B 车间加工各自所要的时间。【输出】
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
****【思路】
一且A机器开始加工,则A机器将会不停地进行作业,关键是B机器在加工过程中有可能要等待A机器。很明显第一个部件在A机器上加工时,B机器必须等待,最后一个部件在B机器上加工时,A机器也在等待B机器的完工
要使机器总的空闲时间最短,就要把在A机器上加工时间最短的部件最先加工,这样使得B机器能在最短的空闲时间内开始加工;把在B机器上加工时间最短的部件放在最后加工,这样使得A机器用最短时间等待B机器完工
贪心策略:
将M按照从小到大的顺序排序,然后从第1个开始处理,若Mi=ai,则将它排在从头开始的作业后面,若Mi=bi,则将它排在从尾开始的作业前面。*
【源代码】
#include<bits/stdc++.h>
using namespace std;
const int N = 100000+5;
struct Node
{
int num;
int id;
bool operator <(Node&a)
{ return num < a.num; }
} m[N];
int a[N],b[N];
int res[N];
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; i++)
cin >> a[i];
for(int i=1; i<=n; i++)
cin >> 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]];
}
cout << timeB <<endl;;
for(int i=1; i<=n; i++)
cout << res[i] << " ";
cout <<endl;
return 0;
}