codevs3008加工生产调度(Johnson算法)

时间:2024-03-20 23:07:07
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans[],a[],b[],sum,ti[];
struct node//三元组结构
{
int o;//工作编号
int t;//时间
int ab;//在哪个机器
}job[];
int cmp(const node &x,const node &y)
{
return x.t<y.t;
}
void Johnson()
{
int i;
for(i=;i<=n;i++)//生成三元组表job
if(a[i]<b[i])
{
job[i].ab=;
job[i].o=i;
job[i].t=a[i];
}
else
{
job[i].ab=;
job[i].o=i;
job[i].t=b[i];
}
sort(job+,job++n,cmp);//排序(按t由小到大)
int l=,r=n+;
for(i=;i<=n;i++)//生成最优解
if(job[i].ab==)ans[++l]=job[i].o;
else ans[--r]=job[i].o;
}
int main()
{
cin>>n;
int i;
for(i=;i<=n;i++)
cin>>a[i];
for(i=;i<=n;i++)
cin>>b[i];
Johnson();//生成最优解
for(i=;i<=n;i++)//计算最少时间
ti[i]=ti[i-]+a[ans[i]];
sum=ti[]+b[ans[]];
for(i=;i<=n;i++)
sum=max(sum,ti[i])+b[ans[i]];
cout<<sum;
return ;
}