社区讨论

47pts~救

P11274「Diligent-OI R1 D」DlgtTemplate参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m44a0urk
此快照首次捕获于
2024/11/30 22:37
去年
此快照最后确认于
2024/11/30 23:06
去年
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e3+2;
long long n,a[MAXN],b[MAXN];
long long cnt[MAXN];
long long dp[MAXN][MAXN],ans_way[MAXN],ans_dp=0;
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
	cnt[1]=1;
	for(int i=2;i<=n;i++){
		if(!b[i]) cnt[i]=cnt[i-1]+1;
		else cnt[i]=cnt[i-1];
	}
	for(int i=n;i>=1;i--){
		for(int j=0;j<=n;j++){
			if(j>=b[i]) dp[i][j]=max(dp[i+1][j],dp[i+1][j-b[i]]+a[i]);
			else dp[i][j]=dp[i+1][j];
		}
		ans_dp=max(dp[i][cnt[i-1]],ans_dp);
	}
	long long z=0,ans_b=0;
	int ans_b_l;
	for(int i=n;i>=1;i--){
		if(!b[i]&&a[i]>0) z+=a[i];
		else if(b[i]){
			if(ans_b<z+a[i]){
				ans_b=z+a[i];
				ans_b_l=i;
			}
		}
	}
	int ans_l=0;
	if(ans_b>ans_dp){
		ans_way[++ans_l]=ans_b_l;
		for(int i=ans_b_l+1;i<=n;i++)
		    if(!b[i]&&a[i]>0) ans_way[++ans_l]=i;
		printf("%d\n",ans_l);
		for(int i=1;i<=ans_l;i++) printf("%lld ",ans_way[i]);
	}else{
		if(ans_dp>0) ans_way[++ans_l]=1;
		int begin_i=0,begin_j=0;
		for(int i=1;i<=n;i++)
		    for(int j=1;j<=cnt[i-1];j++)
		        if(dp[i][j]==ans_dp&&!begin_i&&!begin_j){
		        	begin_i=i;
		        	begin_j=j;
				}
        for(int i=1;i<begin_i;i++)
            if(!b[i]&&a[i]>0) ans_way[++ans_l]=i;
	    for(int i=begin_i;i<=n;i++){
	    	if(dp[i+1][begin_j]!=dp[i][begin_j]&&begin_j+b[i]<=cnt[i-1]){
	    		ans_way[++ans_l]=i;
	    		begin_j+=b[i];
			}
		}
		printf("%d\n",ans_l);
		for(int i=1;i<=ans_l;i++) printf("%lld ",ans_way[i]);
	}
	printf("\n%lld",max(ans_dp,ans_b));
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...