QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#643320 | #3040. Container | DEMONKILLER | WA | 2ms | 9388kb | C++20 | 2.3kb | 2024-10-15 20:40:40 | 2024-10-15 20:40:42 |
Judging History
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);
}
详细
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 9388kb
input:
5 2 11221 21112
output:
0
result:
wrong answer invalid plan.