#Johnson,贪心#CODEVS 3008 SSL 1423 加工生产调度

题目

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


分析

一看这道题就是贪心,问题是怎么贪心。
确定顺序后
伪代码

for (int i=1;i<=n;i++){
        lans+=x;//A车间
        rans=max(lans,rans);//B车间要等A车间
        rans+=y;//加上B车间的时间
}
最后求最大值!

问题是顺序怎么确定。(Johnson算法)
首先,一样产品如果在B车间的时间比A车间的时间多,那么优先,(A车间越早完成,越能开始B车间)
然后我们比较A车间和B车间最小时间,从小到大排序。
(如果是B车间最小,那么因为A车间时间长,所以放在后面)


代码

#include <iostream>
#include <algorithm>
#define MAXN 10001
using namespace std;
struct lszydd{int s1,s2;}work[MAXN]; int n;
bool cmp(lszydd x,lszydd y)
{
	if (x.s1<x.s2&&y.s1>=y.s2) return true;
	if (x.s1<x.s2&&y.s1<y.s2) return x.s1<y.s1;
	if (x.s1>=x.s2&&y.s1>=y.s2) return x.s2>y.s2;
	return 0;
}
int max(int a,int b){return (a>b)?a:b;}
int main(){
	ios::sync_with_stdio(0);
	while (1){
		cin>>n;
		if (!n) break;
		for (int i=1;i<=n;i++) cin>>work[i].s1;
		for (int i=1;i<=n;i++) cin>>work[i].s2;
		stable_sort(work+1,work+1+n,cmp);
		int ans1=0,ans2=0;
		for (int i=1;i<=n;i++){
			ans1+=work[i].s1;
			ans2=max(ans1,ans2)+work[i].s2;
		}
		cout<<ans2<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值