RT, 有且仅有最后一个点 #12 运行状态为 RE,思路与第二篇题解相同(就是经典的 Johnson 法则),求指正:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e3+1e2+1e1+1;
int n,cnt,A[N],B[N],wrk[N],g[N][4];
bool v[N];
struct Node{
int num;//产品编号
int ris;//真实的值
bool grp;//1->A,0->B;
}t[N];
bool cmp(Node a,Node b){
return a.ris<b.ris;
}
int main() {
scanf("%d",&n);
int l=1,r=n;
for(int i=1; i<=n; ++i) {
scanf("%d",&A[i]);
t[++cnt]=(Node){i,A[i],1};
}
for(int i=1; i<=n; ++i) {
scanf("%d",&B[i]);
t[++cnt]=(Node){i,B[i],0};
}
stable_sort(t+1,t+cnt+1,cmp);
for(int i=1;i<=cnt;++i){
Node p=t[i];
if(!v[p.num]) {
v[p.num]=1;
if(p.grp==1) wrk[l++]=p.num;
else wrk[r--]=p.num;
}
}
for(int i=1;i<=n;++i){
g[i][1]=g[i-1][1]+A[wrk[i]];
g[i][2]=max(g[i-1][2],g[i][1])+B[wrk[i]];
}
printf("%d\n",g[n][2]);
for(int i=1;i<=n-1;++i) printf("%d ",wrk[i]);
printf("%d",wrk[n]);
return 0;
}