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

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