【洛谷P1248】加工生产调度

题目大意:某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。

题解:可以先考虑只有两个物品的情况,设两个物品的加工时间分别为 (a_1,b_1,a_2,b_2),则先加工 A 再加工 B 的总时间为 (a_1+max(b_1,a_2)+b_2),先加工 B 再加工 A 的总时间为 (a_2+max(b_2,a_1)+b_1)。若前者更优,则有 (max(b_1,a_2)-b_1-a_2<max(b_2,a_1)-a_1-b_2),整理得 (min(a_1,b_2)<min(b_1,a_2)),按照这个贪心原则即可得到正确答案,详细证明请参照Johnson 法则。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1000;

struct node{int a,b,idx;}e[maxn];
int n,stk[maxn],top;

bool cmp(node& x,node &y){
	return min(x.a,y.b)<min(x.b,y.a);
}

void read_and_parse(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&e[i].a);
	for(int i=1;i<=n;i++)scanf("%d",&e[i].b),e[i].idx=i;
	sort(e+1,e+n+1,cmp);
}

void solve(){
	int ta=0,tb=0;
	for(int i=1;i<=n;i++){
		ta+=e[i].a;
		tb=max(ta,tb)+e[i].b;
		stk[++top]=e[i].idx;
	}
	printf("%d
",tb);
	for(int i=1;i<=n;i++)printf("%d%c",stk[i],i==n?'
':' ');
}

int main(){
	read_and_parse();
	solve();
	return 0;
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10010195.html