CSP-J-2024 题解(T1~T3)

算论坛首发吧。。。

T1 扑克牌
本题就是语法,其实跟 10.20 智灵班模考类似。
我们可以枚举每个输入的扑克牌,存入数组里面。

例如第二组数据:

4
DQ
H3
DQ
DT

那么第一个DQ(方片Q),我们可以将其存入 a[1][12]=1,第二个H3(红桃3),我们可以将其存入 a[3][3]=1。这样存储不会重复,因为如果还是 DQ,那还是存入a[1][12]=1,不会有问题。

核心代码不给了,太简单。

T2 地图探险
CCF叒把大模拟放第二题,太恶毒了

因为这道题样例:
image

所以纯模拟 O(10^6*5) (后面的 5T 的范围)是够的。

模拟按照


就可以了。

核心代码:

        for(int i=1;i<=k;i++){
            int nx,ny;
            //先看方向
            if(d==0){
                nx=x,ny=y+1;
            }
            if(d==1){
                nx=x+1,ny=y;
            }
            if(d==2){
                nx=x,ny=y-1;
            }
            if(d==3){
                nx=x-1,ny=y;
            }
            //第二个点
            if(0<=nx&&nx<n&&0<=ny&&ny<m&&mp[nx][ny]!='x'){
                x=nx,y=ny;
                if(vis[nx][ny]==0){
                    vis[nx][ny]=1;
                    s++;
                }
            }else{
                d++;
                d%=4;
            }
            //cout<<x<<" "<<y<<" "<<d<<endl;
        }

最后!!!
多组样例,不开memset见祖宗。

T3 小木棍
思维题

  • 拼出这个数恰好使用 n 根小木棍;
  • 拼出的数没有前导 0;
  • 在满足以上两个条件的前提下,这个数尽可能小。

由于尽可能小,第一个条件就是数位少,数位少就要每个数多一些木棍,所以!!!最多的木棍就是 8 了,用 7 根木棍拼出来。

接下来,对于是 7 的倍数的数,我们可以直接输出 \frac {n} {7} 个 $8$。

如果有余数怎么办?
以下我们称 p=\frac {n} {7}
对于余数是 1 ,输出 10 后面加 p8
对于余数是 2 ,输出 1 后面加 p-18
对于余数是 3 ,输出 200 后面加 p-28
对于余数是 4 ,输出 20 后面加 p-18
对于余数是 5 ,输出 2 后面加 p8
对于余数是 6 ,输出 6 后面加 p8

提个题外话,我考场代码把余数是 5 的情况写成了 3 后面加 8 ,痛失AC

但是,我的做法还需要 4 种特判。

n=1,cout<<-1
n=3,cout<<7
n=10,cout<<22
n=4,cout<<4

核心代码:不放

3 个赞

第三题正解是高精度搜索或 dp 。我现在正在努力hack掉数学做法。

不会吧,数学好像是正解?是出题人的疏忽?

1 个赞

完了,我写高精dp开string dp[100005],挂了。
数学能 \color{green}{AC}

数学是正解, dp 不对。

1 个赞

但官方正解是搜索。
dp+滚动数组也能AC,但考场上忘记写滚动数组了。