社区讨论
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 条回复,欢迎继续交流。
正在加载回复...