1425:【例题4】加工生产调度

3 篇文章 0 订阅
2 篇文章 0 订阅

题目如下图:

题解:总用时最短,即让机器空闲时间最短。一旦A机器开始,其将进行作业直到最后。B机器则在加工过程中可能会在等待A机器,显然A机器加工第一个产品时,B机器必须等待,而最后一个产品在B机器上加工时,A机器则一停止并等待B机器完工。

使机器空间时间最短,把A机器上加工时间最短的产品最先加工,可使得B机器在最短的等待时间后开始加工;把B机器加工时间最短的产品放在最后,使得A机器用最短的时间等待B机器完工。

尝试用贪心策略:

1、比较对应第i个产品的A机器加工时间ai,B机器加工时间bi,保存对应第i个产品的最小加工时间为mi。

2、将最少加工时间按照从小到大进行排序,然后从第1个开始处理,若mi=ai,则将第i个产品从头开始排序的任务后面,否则,将它排在从尾开始排序的任务前面。

ps:这边一本通不能用sort直接对结构体进行快速排序(why?),所以用了选择结构来排序

一本通代码:

#include<bits/stdc++.h>
using namespace std;

struct stu{
	int a,b,m,i;
}s[10001];

int res[10001];

//一本通不能用这个排序方式??? 
bool cmp(stu x,stu y){
	return x.m<y.m;//从小到大排序 
}

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>s[i].a;
	}
	for(int i=1;i<=n;++i){
		cin>>s[i].b;
		s[i].i = i;
		s[i].m = min(s[i].a,s[i].b);		
	}
	//sort(s+1,s+n+1,cmp);//一本通不能用这个排序方式 
	for(int i=1;i<=n-1;++i){
		for(int j=i+1;j<=n;++j){
			if(s[i].m>s[j].m){
				swap(s[i].a,s[j].a);
				swap(s[i].b,s[j].b);
				swap(s[i].m,s[j].m);
				swap(s[i].i,s[j].i);
			}
		}
	}
	int front = 1;
	int back = n;
	for(int i=1;i<=n;++i){
		if(s[i].a==s[i].m){//A工厂的时间较短 
			res[front++] = i;//记住当前序号,从前往后 
		}else{
			res[back--] = i;//记住当前序号 ,从后往前 
		}
	}
	int t1=0,t2=0;
	for(int i=1;i<=n;++i){
		t1 += s[res[i]].a;//累加A厂的加工时间
		t2 = max(t1,t2);//当前累加最大时间
		t2 += s[res[i]].b;//获取最长加工时间后,累加B厂的加工时间 
	}
	cout<<t2<<endl;
	for(int i=1;i<=n;++i)cout<<s[res[i]].i<<" "; 
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值