思路

不得不说这个排序方法真的很妙。
设定每个零件有x,y,id,分别表示在A车间加工时间,在B车间加工时间,以及编号。
我们比较两个零件的优先级时,加入A应该在B之前加工,那么A.x+B.y+max(A.y,B.x)<B.x+A.y+max(A.x,B.y)
已知min(x,y)+max(x,y)=x+y,那么上式就可以化为min(A.x,B.y)<min(A.y,B.x);
我们以这个规则对所有零件进行排序(如果存在相等的情况,那么优先加工A区间加工时间少的),
问题就解决啦!

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int maxn=2005;

int n;
struct E{
    int x,y,id; //记录每个零件 
}s[maxn];

bool cmp(E a,E b){
    int i= min(a.x,b.y),j=min(a.y,b.x);
    if(i==j) return a.x<b.x; //没有这一步只能过洛谷不能过牛客 
    return i<j;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) s[i].id=i;
    for(int i=1;i<=n;i++) cin>>s[i].x;
    for(int i=1;i<=n;i++) cin>>s[i].y;
    sort(s+1,s+1+n,cmp); //排序 
    int tmp=0,sum=0;//tmp为B车间的工作时间 
    for(int i=1;i<=n;i++){
        tmp-=s[i].x;
        if(tmp<0) tmp=0;
        tmp+=s[i].y;
        sum+=s[i].x; 
    } 
    sum+=tmp; //A车间工作完后B车间还需工作tmp 
    cout<<sum<<"\n";
    for(int i=1;i<=n;i++){
        cout<<s[i].id<<" ";
    }
    return 0;
}