题目
https://www.luogu.org/problemnew/show/P1248
思路
n个作业要在由两台机器M1和M2组成的流水线上完成加工.每个作业i必须先在M1上然后在M2上加工,时间分别为ai和bi。
确定这n个作业的加工顺序,使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小。
直观上,最优调度一定让M1没有空闲,M2的空闲时间尽量少。
算法:
①使用数组f1[j] 存放a[i]<b[i]的作业;
②使用数组f2[k] 存放a[i]>=b[i]的作业;
③对f1[j]根据a[j]进行升序排列;
④对f2[k]根据b[k]进行降序排列;
⑤遍历两个数组,依次求时间:取两个机器运行时间的较大值作为作业用时。
代码
#include<bits/stdc++.h>
using namespace std;
struct NN
{
int a,b,minn,pm;
};
NN T1[1005],T2[1005];
bool cmp(NN x,NN y){return x.minn<y.minn;}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>T1[i].a;
for(int i=1;i<=n;i++)cin>>T1[i].b;
for(int i=1;i<=n;i++){T1[i].minn=min(T1[i].a,T1[i].b);T1[i].pm=i;}
sort(T1,T1+n+1,cmp);
int l=1,r=n;
for(int i=1;i<=n;i++)
{
if(T1[i].minn==T1[i].a){T2[l++]=T1[i];}
else {T2[r--]=T1[i];}
}
int i=1,at=0,bt=0,t=T2[1].a;T2[n+1].a=0;
while(i<=n)
{
bt+=T2[i].b;at=T2[++i].a;
if(at<bt)
{
bt-=at;t+=at;at=0;
}
else if(at>=bt)
{
t+=at;at=0;bt=0;
}
}t+=bt;
cout<<t<<endl;
for(int i=1;i<=n;i++)
cout<<T2[i].pm<<' ';
cout<<endl;
}