有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;
}