加工生产调度
Description
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
Input
第一行仅—个数据n(0 < n < 1000),表示产品的数量。接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。
Output
第一行一个数据,表示最少的加工时间;第二行是一种最小加工时间的加工顺序。
Sample Input
5 3 5 8 7 10 6 2 1 4 9
Sample Output
34 1 5 4 2 3
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct point {
int x,y,minn,i;
};
bool operator<(const point&x,const point&y) {
return x.minn<y.minn;
}
point a[1005];
int ans[1005];
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i].x;
for(int i=1; i<=n; i++)cin>>a[i].y;
for(int i=1; i<=n; i++) {
a[i].minn=min(a[i].x,a[i].y);
a[i].i=i;
}
sort(a+1,a+1+n);
int x=1,y=n;
for(int i=1; i<=n; i++) {
if(a[i].minn==a[i].x)ans[x++]=a[i].i;
else ans[y--]=a[i].i;
}
int timea=0,timeb=0,mina=2100000000,minb=2100000000;
for(int i=1; i<=n; i++) {
timea+=a[i].x;
timeb+=a[i].y;
mina=min(mina,a[i].x);
minb=min(minb,a[i].y);
}
cout<<max(timea+minb,timeb+mina)<<endl;
for(int i=1; i<=n; i++)cout<<ans[i]<<' ';
return 0;
}