题目描述
某工厂收到了 nn 个产品的订单,这 nn 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 ii 在 A,B 两车间加工的时间分别为 Ai,BiAi,Bi。怎样安排这 nn 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。
输入格式
第一行仅—个数据 nn ,表示产品的数量;
接下来 nn 个数据是表示这 nn 个产品在 A 车间加工各自所要的时间;
最后的 nn 个数据是表示这 nn 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个数据,表示最少的加工时间;
第二行是一种最小加工时间的加工顺序。
样例
Input | Output |
---|---|
5 3 5 8 7 10 6 2 1 4 9 | 34 1 5 4 2 3 |
#include"stdio.h"
#include"string.h"
#include"algorithm"
#include"iostream"
using namespace std;
struct dd
{
int x,y,f,id;
} w[101101];
bool cc(dd q,dd p)
{
if(q.f==p.f)
{
if(q.f==0) //A车间所用时间小于B车间所用时间
return q.x<p.x;//为让B车间少等
else
return q.y>p.y;//A车间所用时间写大于B车间所用时间 ,
}
else
return q.f<p.f;//A车间所用时间小于B车间所用时间排在前边,为让B车间少等
}
int main()
{
int n,i,j,k;
cin>>n;
for(i=0; i<n; i++)cin>>w[i].x;
for(i=0; i<n; i++)cin>>w[i].y;
for(i=0; i<n; i++)w[i].f=w[i].x<w[i].y?0:1,w[i].id=i+1;
sort(w,w+n,cc);
int ta=0,tb=0;//ta,tb分别表示做完一些产品在两个车间各自所用的的时间
for(i=0; i<n; i++)
{
ta+=w[i].x;
tb=max(ta,tb)+w[i].y;//max(ta,tb)在B车间能够加工第i个产品是前所用掉的最小时间和?
}
printf("%d\n",tb);
for(i=0; i<n-1; i++)
printf("%d ",w[i].id);
printf("%d",w[i].id);
return 0;
}
数据范围与提示
对于 100%100%的数据, 0<n<1000,1≤Ai,Bi≤3500<n<1000,1≤Ai,Bi≤350。
本题的 SPJ 对行尾多余空格敏感,各位输出答案时不要留行尾多余空格~