题目描述
某工厂收到了 n 个产品的订单,这 n 个产品分别在 A、B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工。
某个产品 i 在 A、B 两车间加工的时间分别为Ai,Bi。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。
这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A、B 两车间加工完毕的时间。
输入格式
第一行仅—个整数 n,表示产品的数量。
接下来一行 n 个整数是表示这 n 个产品在 A 车间加工各自所要的时间。
最后的 n 个整数是表示这 n 个产品在 B 车间加工各自所要的时间。
输出格式
第一行一个整数,表示最少的加工时间。
第二行是一种最小加工时间的加工顺序。
输入输出样例
输入 #1
5 3 5 8 7 10 6 2 1 4 9
输出 #1
34 1 5 4 2 3 A机器上加工时间短的任务应优先,而在B机器上加工时间短的任务应该排在后面。
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-03-17 11:02:14
* @LastEditTime: 2022-03-17 11:41:28
*/
#include<bits/stdc++.h>
using namespace std;
int n,ans[10000],ti[10000],a[10000],b[10000];
struct node{
int minn;
int order;
};
node t[10000];
bool cmp(node x,node y)
{
if(x.minn<y.minn)
return true;
else
return false;
}
int main()
{
while(cin>>n){
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(ti,0,sizeof(ti));
for(int i=1;i<=n;i++){
t[i].order=i;
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
t[i].minn=min(a[i],b[i]);
}
sort(t+1,t+1+n,cmp);
int l=0,r=n+1;
for(int i=1;i<=n;i++){//A时间短的往前面塞
if(t[i].minn==a[t[i].order]){
l++;
ans[l]=t[i].order;
}
else{
r--;
ans[r]=t[i].order;
}
}
for(int i=1;i<=n;i++)
ti[i]=ti[i-1]+a[ans[i]];
int sum=ti[1]+b[ans[1]];
for(int i=2;i<=n;i++)
sum=max(ti[i],sum)+b[ans[i]];
cout<<sum<<endl;
// for(int i=1;i<=n;i++)
// cout<<ans[i]<<" ";
}
}