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 }