解析
和国王游戏一样的做法
容易写出cmp函数的依据:
min(u.a,v.b)<min(u.b,v.a)
但是这个题的比较函数有一个取min的操作
这个东西会有一个问题:不满足不可比性的传递性
通俗的说,x=y,y=z,但是x不一定=z
比如说如果y的a和b都很小,就会出现这个无论a和c之间关系如何,等式总是成立的尴尬情况
为了避免这个东西,引入了Johnson 法则
设置d
d=1(a>b)
d=0(a=b)
d=-1(a<b)
在d不同时,优先按照d排序(显然d不同时是正确的)
d相同在把他们的最小值比较即可
bool operator<(const node &x)const{if(d==x.d){if(d<=0)return a<x.a;//这里的等于是将上面的情况2找了一种方法排序else return b>x.b;}return d<x.d;
}
代码
(先是自己搞的所有没有按题解写)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
const int N=4e3+100;
const int M=150;
const int mod=998244353;
const int mx=7e4;
inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n;
struct node{int a,b,id;
}p[N];
bool cmp (const node u,node v){if(min(u.a,v.b)!=min(u.b,v.a)) return min(u.a,v.b)<min(u.b,v.a);return u.a<v.a;
}int main(){n=read();for(int i=1;i<=n;i++) p[i].a=read(),p[i].id=i;for(int i=1;i<=n;i++) p[i].b=read();sort(p+1,p+1+n,cmp);int ta=0,tb=0;for(int i=1;i<=n;i++){ta+=p[i].a;tb=max(ta,tb)+p[i].b;}printf("%d\n",tb);for(int i=1;i<=n;i++){printf("%d",p[i].id);putchar(' ');}return 0;
}
/**/