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;
}

猜你喜欢

转载自www.cnblogs.com/mysh/p/11795731.html
今日推荐