神秘WA,玄关求调
查看原帖
神秘WA,玄关求调
745929
Komeijizen楼主2024/12/17 15:33

救救孩子吧,被卡了快两天了...或者给组hack也行

#include<bits/stdc++.h>
using namespace std;

int n,m,p[205],q[205];
int dp[205][25][805];
int d[205][25][805];
pair<int,int>fr[205][25][805];

const int D=400,M=800;
stack<int>met;
void getans(int k,int i,int j){
    if(d[k][i][j]<=0)return;
    met.push(d[k][i][j]);
    getans(d[k][i][j]-1,i-1,j-p[d[k][i][j]]+q[d[k][i][j]]);
}
int main(){
    //File(1,1);
    for(int T=1;;T++){
        cin>>n>>m;
        if(n==0)break;
        for(int i=1;i<=n;i++)cin>>p[i]>>q[i];
        
        memset(d,-1,sizeof d);
        memset(dp,-1,sizeof dp);
        memset(fr,0,sizeof fr);
        dp[0][0][D]=0;
        for(int k=1;k<=n;k++){//当前考虑的物品编号
            for(int i=0;i<=m;i++){
                for(int j=0;j<=M;j++){
                    d[k][i][j]=d[k-1][i][j];
                }
            }
            for(int i=min(k-1,m);i>=0;i--){//空间
                int del=p[k]-q[k];
                
                for(int j=0;j<=M;j++){
                    
                    if(dp[k-1][i][j]<0)continue;
                    int nx=j+del;
                    if(nx<0 or nx>M)continue;
                    d[k][i][j]=d[k-1][i][j];
                    dp[k][i][j]=dp[k-1][i][j];
                    fr[k][i][j]={fr[k-1][i][j].first,fr[k-1][i][j].second};
                    
                    if(dp[k-1][i][j]+p[k]+q[k]>dp[k][i+1][nx]){
                        dp[k][i+1][nx]=dp[k-1][i][j]+p[k]+q[k];
                        fr[k][i+1][nx]={fr[k-1][i][j].first+p[k],fr[k-1][i][j].second+q[k]};
                        d[k][i+1][nx]=k;
                    }
                    
                }
            }
        }
        int ans=(int)1e9,ant;
        for(int i=0;i<=M;i++){
            if(dp[n][m][i]<=0)continue;
            if(abs(i-D)<ans or(abs(i-D)==ans and dp[n][m][i]>=dp[n][m][ant])){ans=abs(i-D),ant=i;}
            
        }
        getans(n,m,ant);
        printf("Jury #%d\n",T);
        printf("Best jury has value %d for prosecution and value %d for defence:\n",fr[n][m][ant].first,fr[n][m][ant].second);
        while(met.size())printf(" %d",met.top()),met.pop();
        printf("\n\n");
    }   
}
2024/12/17 15:33
加载中...