加工生产调度/爬山Mountain Climbing

洛咕

洛咕

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

这是一个很经典的贪心模型.我们把这N件物品按照两个时间的最小时间从小到大排序.然后如果最小时间是由A[i]得到的就放在前面做,如果最小时间是由B[i]得到的就放在后面做(因为本题贪心思想就是机器A不停工作,然后让机器B的等待时间+最后机器A的等待时间最短),这样得到的序列就是最优加工顺序,然后求出最优时间就很简单了.

加工生产调度需要输出时间和顺序,我就放这道题的代码了.然后两道题的读入有点不同,注意一下就行.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=25005;
int b[N],c[N],d[N];
struct ppx{int up,down,minn,id;}a[N];
inline bool cmp(const ppx &x,const ppx &y){return x.minn<y.minn;}
int main(){
	int n=read();
	for(int i=1;i<=n;++i){
		a[i].up=read();
		a[i].id=i;
	}
	for(int i=1;i<=n;++i){
		a[i].down=read();
		a[i].minn=min(a[i].up,a[i].down);
	}
	sort(a+1,a+n+1,cmp);
	int head=0,tail=n+1;
	for(int i=1;i<=n;++i){
		if(a[i].minn==a[i].up){
			b[++head]=a[i].id;
			c[head]=a[i].up;
			d[head]=a[i].down;
		}
		else{
			b[--tail]=a[i].id;
			c[tail]=a[i].up;
			d[tail]=a[i].down;
		}
	}
	int s=0,t=0;
	for(int i=1;i<=n;++i){
		s+=c[i];
		if(t<s)t=s;
		t+=d[i];
	}
	printf("%d\n",t);
	for(int i=1;i<=n;++i)
		printf("%d ",b[i]);
	printf("\n");
    return 0;
}

posted on 2019-07-30 15:55  PPXppx  阅读(134)  评论(0编辑  收藏  举报