New:

n个物品要在两个机器上加工 时间分别为ai bi 必须现在第一台机器上加工 求最短加工时间

Johnson算法:

N1为a<b物品集合 N2为a>=b物品集合

N1物品按a升序排序 N2按b降序排序 N1接N2为最优顺序

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #define inf 2139062143
10 #define ll long long
11 #define MAXN 1010
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int n,res,a[MAXN],b[MAXN],id[MAXN],mn[MAXN],ans[MAXN];
21 int main()
22 {
23     n=read();
24     for(int i=1;i<=n;i++) id[i]=i,a[i]=read();
25     for(int i=1;i<=n;i++) mn[i]=min(a[i],b[i]=read());
26     for(int i=1;i<=n;i++)
27         for(int j=i+1;j<=n;j++)
28             if(mn[i]>mn[j]) {swap(mn[i],mn[j]);swap(id[i],id[j]);}
29     for(int i=1,s=0,t=n+1;i<=n;i++)
30         if(mn[i]==a[id[i]]) ans[++s]=id[i];
31         else ans[--t]=id[i];
32     for(int i=1,s=0;i<=n;i++)
33         s+=a[ans[i]],res=max(res+b[ans[i]],s+b[ans[i]]);
34     printf("%d\n%d",res,ans[1]);
35     for(int i=2;i<=n;i++) printf(" %d",ans[i]);
36 }
View Code

相关文章:

  • 2022-12-23
  • 2021-06-29
猜你喜欢
  • 2022-12-23
  • 2021-08-12
  • 2021-07-04
  • 2021-11-03
  • 2022-01-05
  • 2021-08-19
  • 2021-09-07
相关资源
相似解决方案