「一本通 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值