P1248 加工生产调度
题目描述
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
输入格式
第一行仅—个数据n(0<n<1000),表示产品的数量。
接下来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
思路
代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n;
struct no {
int a,b,minn,pm;
} t1[N],t2[N];
bool cmp(no a,no b) {
return a.minn<b.minn;
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&t1[i].a);
for(int i=1; i<=n; i++)
scanf("%d",&t1[i].b);
for(int i=1; i<=n; i++) {
t1[i].minn=min(t1[i].a,t1[i].b);
t1[i].pm=i;
}
sort(t1,t1+n+1,cmp);
int l=1,r=n;
for(int i=1; i<=n; i++) {
if(t1[i].minn==t1[i].a)
t2[l++]=t1[i];
else
t2[r--]=t1[i];
}
int i=1,at=0,bt=0,t=t2[1].a;
t2[n+1].a=0;
while(i<=n) {
bt+=t2[i].b;
at=t2[++i].a;
if(at<bt) {
bt-=at;
t+=at;
at=0;
} else if(at>=bt) {
t+=at;
at=0;
bt=0;
}
}
t+=bt;
printf("%d\n",t);
for(int i=1; i<=n; i++)
printf("%d ",t2[i].pm);
printf("\n");
return 0;
}

浙公网安备 33010602011771号