比赛 期末考试0 评测结果 WAAAWAWWAW
题目名称 Sayaku,移动 最终得分 50
用户昵称 djyqjy 运行时间 0.029 s
代码语言 C++ 内存使用 3.88 MiB
提交时间 2026-02-07 11:15:11
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define pir pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
int T;
void clear();
const int N=2010;
int n;
char c[N];
int ls[N],rs[N];
int dfs(int x,int l,int r)
{
    if(c[x]=='0') return x;
    else if(c[x]=='1')
    {
        ls[x]=x+1;
        return dfs(x+1,l+1,r);
    }
    else if(c[x]=='2')
    {
        rs[x]=x+1;
        return dfs(x+1,l+1,r);
    }
    else if(c[x]=='3')
    {
        ls[x]=x+1;
        rs[x]=dfs(x+1,l+1,r)+1;
        return dfs(rs[x],rs[x],r);
    }
}
int ans=0x3f3f3f3f;
int res[N][2];
pir solve(vector<int> &vec)// fi : 0 , se : 1
{
    vector<int> v1,v2;v1.clear();v2.clear();
    for(int x:vec) if(ls[x]) v1.pb(ls[x]);
    for(int x:vec) if(rs[x]) v2.pb(rs[x]);
    if(v1.size()==0&v2.size()==0) return mp(0,0);
    else if(v1.size()==0)
    {
        pir tmp=solve(v2);
        return mp(tmp.fi+1,tmp.se+2);
    }
    else if(v2.size()==0)
    {
        pir tmp=solve(v1);
        return mp(tmp.fi+1,tmp.se+2);
    }
    else
    {
        pir tmp1=solve(v1),tmp2=solve(v2);
        return mp(min(tmp1.se+tmp2.fi,tmp2.se+tmp1.fi)+3,tmp1.se+tmp2.se+4);
    }
}
void work()
{
    freopen("movement.in","r",stdin);
    freopen("movement.out","w",stdout);
    clear();
    scanf("%s",c+1);
    n=strlen(c+1);
    dfs(1,1,n);
    vector<int> tmpp;tmpp.clear();tmpp.pb(2);
    if(ls[1]==0||rs[1]==0) ans=min(ans,1+solve(tmpp).fi);

    {
        int now=1;
        vector<int> vec;vec.clear();
        while(now)
        {
            if(rs[now]) vec.pb(rs[now]);
            now=ls[now];
        }
        ans=min(ans,3+solve(vec).se);
        vec.clear();now=1;
        while(now)
        {
            if(ls[now]) vec.pb(ls[now]);
            now=rs[now];
        }
        ans=min(ans,3+solve(vec).se);
    }
    printf("%d\n",ans);
    return;
}
int main()
{
    T=1;
    while(T--) work();
    return 0;
}
void clear()
{
    return;
}