2024初三年前集训测试1

2024初三年前集训测试1

\(T1\) 学说话 \(100pts\)

  • 找到下划线后将计数器归零。

    点击查看代码
    string s;
    int main()
    {
        freopen("word.in","r",stdin);
        freopen("word.out","w",stdout);
        int ans=0,num=0,len,i;
        cin>>s;
        len=s.size();
        for(i=0;i<=len-1;i++)
        {
            if(s[i]=='_')
            {
                ans=max(ans,num);
                num=0;
            }
            else
            {
                num++;
            }
        }
        ans=max(ans,num);
        cout<<ans<<endl;
        fclose(stdin);
        fclose(stdout);
        return 0;
    } 
    

\(T2\) 膜拜大佬 \(100pts\)

  • map 大法好。

    点击查看代码
    map<string,bool>vis;
    string s1,s2,s3;
    int main()
    {
        freopen("dalao.in","r",stdin);
        freopen("dalao.out","w",stdout);
        ll n,m,i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>s1;
            vis[s1]=true;
        }
        cin>>m;
        for(i=1;i<=m;i++)
        {
            cin>>s1>>s2>>s3;
            if(vis.find(s3)==vis.end())
            {
                cout<<"No"<<endl;
            }
            else
            {
                cout<<"Yes"<<endl;
            }
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

\(T3\) 走迷宫 \(70pts\)

  • 难点在于如何建图。

    • 把一个二维矩阵压缩成一行,即原第 \(i\) 行第 \(j\) 列的点压缩后成了第 \((i-1)m+j\) 个点。
    • @= 同样视作 . ,分别向 \(4\) 个方向在可以通过的情况下连一条边权为 \(1\) 的有向边。
    • 当我们走到传送装置上时,会离开传送到另一个传送装置。故我们选择将传送装置与另一个传送装置的 \(4\) 个方向在可以通过的情况下连一条边权为 \(1\) 的有向边。
  • 因边权只有 \(0\)\(1\) ,故使用 \(BFS\)\(01BFS\) 或其他求解单源最短路算法均可。

    点击查看代码
    struct node
    {
        ll nxt,to,w;
    }e[4000000];
    ll dis[4000000],head[4000000],sum[30],cnt=0;
    char c[2000][2000];
    bool vis[4000000];
    pair<ll,ll>zimu[30][3];
    void add(ll u,ll v,ll w)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        e[cnt].w=w;
        head[u]=cnt;
    }
    ll val(ll i,ll j,ll m)
    {
        return (i-1)*m+j;
    }
    void dijkstra(ll s)
    {
        memset(dis,0x3f,sizeof(dis));
        memset(vis,false,sizeof(vis));
        priority_queue<pair<ll,ll> >q;
        ll x,i;
        dis[s]=0;
        q.push(make_pair(0,-s));
        while(q.empty()==0)
        {
            x=-q.top().second;
            q.pop();
            if(vis[x]==false)
            {
                vis[x]=true;
                for(i=head[x];i!=0;i=e[i].nxt)
                {
                    if(dis[e[i].to]>dis[x]+e[i].w)
                    {
                        dis[e[i].to]=dis[x]+e[i].w;
                        q.push(make_pair(-dis[e[i].to],-e[i].to));
                    }
                }
            }
        }
    }
    int main()
    {
        freopen("maze.in","r",stdin);
        freopen("maze.out","w",stdout);
        ll n,m,i,j,s,t;
        cin>>n>>m;
        for(i=0;i<=m+1;i++)
        {
            c[0][i]='#';
            c[n+1][i]='#';
        }
        for(i=0;i<=n+1;i++)
        {
            c[i][0]='#';
            c[i][m+1]='#';
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cin>>c[i][j];
                if(c[i][j]=='@')
                {
                    s=val(i,j,m);
                }
                if(c[i][j]=='=')
                {
                    t=val(i,j,m);
                }
                if('A'<=c[i][j]&&c[i][j]<='Z')
                {
                    sum[c[i][j]-'A'+1]++;
                    zimu[c[i][j]-'A'+1][sum[c[i][j]-'A'+1]]=make_pair(i,j);
                }
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(c[i][j]=='.'||c[i][j]=='@')
                {
                    if(c[i-1][j]!='#')
                    {
                        add(val(i,j,m),val(i-1,j,m),1);
                    }
                    if(c[i][j-1]!='#')
                    {
                        add(val(i,j,m),val(i,j-1,m),1);
                    }
                    if(c[i+1][j]!='#')
                    {
                        add(val(i,j,m),val(i+1,j,m),1);
                    }
                    if(c[i][j+1]!='#')
                    {
                        add(val(i,j,m),val(i,j+1,m),1);
                    }
                }
            }
        }
        for(i=1;i<=26;i++)
        {
            if(sum[i]!=0)
            {
                if(c[zimu[i][2].first-1][zimu[i][2].second]!='#')
                {
                    add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first-1,zimu[i][2].second,m),1);
                }
                if(c[zimu[i][2].first][zimu[i][2].second-1]!='#')
                {
                    add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first,zimu[i][2].second-1,m),1);
                }
                if(c[zimu[i][2].first+1][zimu[i][2].second]!='#')
                {
                    add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first+1,zimu[i][2].second,m),1);
                }
                if(c[zimu[i][2].first][zimu[i][2].second+1]!='#')
                {
                    add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first,zimu[i][2].second+1,m),1);
                }
                if(c[zimu[i][1].first-1][zimu[i][1].second]!='#')
                {
                    add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first-1,zimu[i][1].second,m),1);
                }
                if(c[zimu[i][1].first][zimu[i][1].second-1]!='#')
                {
                    add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first,zimu[i][1].second-1,m),1);
                }
                if(c[zimu[i][1].first+1][zimu[i][1].second]!='#')
                {
                    add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first+1,zimu[i][1].second,m),1);
                }
                if(c[zimu[i][1].first][zimu[i][1].second+1]!='#')
                {
                    add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first,zimu[i][1].second+1,m),1);
                }
            }
        }
        dijkstra(s);
        cout<<((dis[t]==0x3f3f3f3f3f3f3f3f)?-1:dis[t])<<endl;
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

\(T4\) 鸭子游戏 \(10pts\)

  • 原题:luogu P4552 [Poetize6] IncDec Sequence 的第一问。

  • 观察到 \([l,r]\) 内的数都加 \(1\) 或减 \(1\) ,此时有差分数组不变,考虑进行差分。

  • \(b_{1}=a_{1},b_{i}=a_{i}-a_{i-1}(2 \le i \le n)\) 。我们选择固定 \(b_{1}\) 不变,题意要求转化为让 \(b_{2} \sim b_{n}\) 均等于 \(0\)

  • \(p=\sum\limits_{i=2}^{n}[b_{i}>0] \times b_{i},q=\sum\limits_{i=2}^{n}[b_{i}<0] \times (-b_{i})\) 。考虑先把 \(b_{2} \sim b_{n}\) 都统一成正号或负号,需要 \(\min(p,q)\) 次次数;然后有 \(\sum\limits_{i=2}^{n}|b_{i}|=\max(p,q)- \min(p,q)\) ,为使 \(\sum\limits_{i=2}^{n}|b_{i}|=0\) 需要 \(\max(p,q)- \min(p,q)\) 次次数。故 \(\min(p,q)+ \max(p,q)- \min(p,q)= \max(p,q)\) 即为所求。

    点击查看代码
    ll a[2000002],b[2000002];
    int main()
    {
        freopen("game.in","r",stdin);
        freopen("game.out","w",stdout);
        ll n,p=0,q=0,i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i]-a[i-1];
        }
        for(i=2;i<=n;i++)
        {
            p+=(b[i]>0)?b[i]:0;
            q+=(b[i]<0)?-b[i]:0;
        }
        cout<<max(p,q)<<endl;
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

总结

  • \(T3\) 暴露出自己的思维和能力太差,典型套路知道不全。
  • \(T4\) 最后想出了结论,但少了个负号,挂了 \(90pts\)

后记

  • 模拟赛重复利用。
  • 这套题数据太水了,导致部分错解获得了较高的分数。
  • 部分分很足,但貌似不太符合普及难度比赛的要求,起不到提升拿部分分能力的效果。
  • \(T3\)\(9\) 个测试点的数据如下。
posted @ 2024-01-31 13:59  hzoi_Shadow  阅读(279)  评论(2)    收藏  举报
扩大
缩小