最后一个点 RE ,88分求助
查看原帖
最后一个点 RE ,88分求助
335552
Christophe_楼主2021/11/14 17:18

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;
}
2021/11/14 17:18
加载中...