「一本通 1.1 例 4」加工生产调度-- 贪心

loj 10003

题目分析:

  • 经典的流水作业调度问题
  • 使用 J o h n s o n Johnson Johnson算法,设 N 1 a &lt; b N 2 a &gt; = b N 1 a N 2 b N 1 N 2 N_1为a&lt;b的集合,N_2为a&gt;=b的集合,将N_1按照a非减序排序,N_2按照b非增序排列,则N_1作业接N_2作业为最优决策 N1a<bN2a>=bN1aN2bN1N2

Code:

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

int n,a[maxn],b[maxn],ans[maxn];
struct node {
	int w,id;
}e[maxn];

inline int read_() {
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}

inline bool cmp_(node aa,node bb) {
	return aa.w < bb.w;
}

inline void work_() {
	for(int i=1;i<=n;++i) {
		e[i].w=min(a[i],b[i]);
		e[i].id=i;
	}
	sort(e+1,e+1+n,cmp_);
	int l=0,r=n+1;
	for(int i=1;i<=n;++i) {
		if(e[i].w==a[e[i].id]) {
			ans[++l]=e[i].id;
		}
		else {
			ans[--r]=e[i].id;
		}
	}
	l=0,r=0;
	for(int i=1;i<=n;++i) {
		int u=ans[i];
		l+=a[u];
		if(r<l) r=l;
		r+=b[u]; 
	}
	printf("%d\n",r);
	for(int i=1;i<=n-1;++i) {
		printf("%d ",ans[i]);
	}
	printf("%d",ans[n]);
}
void readda_() {
	n=read_();
	for(int i=1;i<=n;++i) {
		a[i]=read_();
	}
	for(int i=1;i<=n;++i) {
		b[i]=read_();
	}
	work_();
}

int main() {
	freopen("a.txt","r",stdin);
	readda_();
	return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务