题目来源:loj
题目描述
某工厂收到了 个产品的订单,这 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 在 A,B 两车间加工的时间分别为 。怎样安排这 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。
输入格式
第一行仅—个数据 ,表示产品的数量;
接下来 个数据是表示这 个产品在 A 车间加工各自所要的时间;
最后的 个数据是表示这 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
样例输入
5
3 5 8 7 10
6 2 1 4 9
样例输出
34
1 5 4 2 3
数据范围与提示
对于100% 的数据,0<n<1000 ,所有数值皆为整数。
思路
求一个加工顺序使得加工总用时最短,就是让机器的空闲时间最短。一旦A车间开始加工,则A车间就会不停地进行作业,关键是B车间在加工过程中有可能要等待A车间。很明显第一个产品在A车间上加工时,B车间必须等待,最后一个产品在B车间上加工时,A车间也在等待B车间的完工。
可以大胆猜想,要使车间的空闲时间最短,就要把在A车间上加工时间最短的产品最先加工,这样使得B车间能在最短的空闲时间内开始加工;把在B车间上加工时间最短的产品放在最后加工,这样使得A车间用最短的时间等待B车间完工。
所以我们应该让在A车间上加工时间短的产品优先,而在B车架上加工时间短的产品排在后面
所以我们要做的事就是:
(1)就要把在A车间加工时间最短的部件优先加工,这样使得B车间能以最快的速度开始加工
(2)把放在B车间加工时间最短的产品放在最后加工,这样使得最后A车间的空闲时间最少
code
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,a[N],b[N],order[N];
struct node{
int time,belong,id;
}c[N];
void init()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
c[i].id=i;
if (a[i]<b[i]) //在A上加工的时间更短
{
c[i].time=a[i];
c[i].belong=0;
}
else //在B上加工的时间更短
{
c[i].time=b[i];
c[i].belong=1;
}
}
return;
}
int cmp(node x,node y) { return x.time<y.time; }
void make_order()
{
int cnt1=1,cnt2=n;
sort(c+1,c+1+n,cmp);
for (int i=1;i<=n;i++)
{
if (c[i].belong==0) //在A上加工的时间更短,从头开始排
order[cnt1++]=c[i].id;
else //在B上加工的时间更短,从尾开始排
order[cnt2--]=c[i].id;
}
return;
}
void work()
{
int A=0,B=0;//A:A的加工时间 B:B的加工时间
for (int i=1;i<=n;i++)
{
A+=a[order[i]];
if (B<A) B=A;
B+=b[order[i]];
}
cout<<B<<endl;
for (int i=1;i<=n;i++) printf("%d ",order[i]);
return;
}
int main()
{
init();
make_order();
work();
return 0;
}