QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#643320#3040. ContainerDEMONKILLERWA 2ms9388kbC++202.3kb2024-10-15 20:40:402024-10-15 20:40:42

Judging History

你现在查看的是最新测评结果

  • [2024-10-15 20:40:42]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:9388kb
  • [2024-10-15 20:40:40]
  • 提交

answer

#include<bits/stdc++.h>
#define N 1010
#define Pii pair<int,int>
#define Fi first
#define Se second
using namespace std;
const int Inf=2e9;
char s[N];
vector<Pii> Res;
vector<int> Pos[2],L,R;
int Sub,n,C,Num,pos[N],to[N],Sum[2][N],f[N][N],g[N][N];
int main(){
    // freopen("machine.in","r",stdin);
    // freopen("machine.out","w",stdout);
    scanf("%d%d%d%s",&Sub,&n,&C,s+1);
    for(int i=1;i<=n;i++)
        if(s[i]=='2')pos[++Num]=i;
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
        if(s[i]=='2'){
            Sum[i&1][i]=1;
            Pos[i&1].emplace_back(i);
        }
    for(int i=0;i<=1;i++)
        for(int j=2;j<=n;j++)
            Sum[i][j]+=Sum[i][j-1];
    memset(f,0x3f,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=Num;i++)
        for(int j=0;j<i;j++)
            if(f[i][j]<Inf){
                if(j<Sum[0][n]){
                    int x=Pos[0][j];
                    int Dis=abs(pos[i]-x);
                    int Val=(Dis>>1)*(C+4)+(Dis&1)*(C+3)+max(0,Sum[1][x]-i+j+1);
                    if(f[i][j+1]>f[i-1][j]+Val){
                        g[i][j+1]=0;
                        f[i][j+1]=f[i-1][j]+Val;
                    }
                }
                if((i-j-1)<Sum[1][n]){
                    int x=Pos[1][i-j-1];
                    int Dis=abs(pos[i]-x);
                    int Val=(Dis>>1)*(C+4)+(Dis&1)*(C+3)+max(0,Sum[0][x]-j);
                    if(f[i][j]>f[i-1][j]+Val){
                        g[i][j]=1;
                        f[i][j]=f[i-1][j]+Val;
                    }
                }
            }
    int Cnt1=Sum[0][n],Cnt2=Sum[1][n];
    for(int i=Num;i;i--)
        if(!g[i][Cnt1])
            to[pos[i]]=Pos[0][--Cnt1];
        else to[pos[i]]=Pos[1][--Cnt2];
    for(int i=1;i<=Num;i++){
        if(pos[i]<to[pos[i]])L.emplace_back(pos[i]);
        else if(pos[i]>to[pos[i]])R.emplace_back(pos[i]);
    }
    reverse(L.begin(),L.end());
    for(int i:L){
        int l=i,r=to[i];
        while(r-l>1)
            Res.emplace_back(l,l+2),l+=2;
        if(r-l)Res.emplace_back(l,r);
    }
    for(int i:R){
        int l=to[i],r=i;
        while(r-l>1)
            Res.emplace_back(r-2,r),r-=2;
        if(r-l)Res.emplace_back(l,r);
    }
    printf("%d\n",Res.size());
    for(Pii i:Res)printf("%d %d\n",i.Fi,i.Se);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 9388kb

input:

5 2
11221
21112

output:

0

result:

wrong answer invalid plan.