[luogu1248] 加工生产调度 题解
考虑 \(i\) 排在 \(j\) 前的条件是 \(a_i+\max(a_j,b_i)+b_j\le a_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直接转化为 \(\min(a_j,b_i)\ge\min(a_i,b_j)\),然后就按皇后游戏中的排序方法就可以了……
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct hand{
int a,b,id;
}peo[1005];
int d(hand x){
if(x.a==x.b) return 0;
return ((x.a>x.b)?1:-1);
}int cmp(hand x,hand y){
if(d(x)!=d(y)) return d(x)<d(y);
if(d(x)>0) return x.b>y.b;
return x.a<y.a;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>peo[i].a;
for(int i=1;i<=n;i++)
cin>>peo[i].b,peo[i].id=i;
sort(peo+1,peo+n+1,cmp);
int s=0,c=0;
for(int i=1;i<=n;i++){
s+=peo[i].a;
c=max(c,s)+peo[i].b;
}cout<<c<<"\n";
for(int i=1;i<=n;i++)
cout<<peo[i].id<<" ";
return 0;
}