CSP-J 2024复赛游记

haungyuze114514

2024-10-28 19:47:08

Life & Travel

DAY 0 10/25

5:30 出校打车,绿车看成了蓝车,那车一直在我面前按喇叭。

5:50 到家了。才发现准考证忘学校里了,啊

6:15 打印完准考证后出家门了,6:30 到了火车站,看到了 cyc,cmk 和 ht。

8点左右 到九江力,去酒店看了会书就睡了。

DAY 1 10/26

7:20 出酒店,发现好多来考试的。

8:10 进考场,有小学生问能不能带零食,监考老师没绷住,后来竟然说可以。

8:30 下载文件,网络出了问题,延期半小时。

9:00 开考。

T1 扑克牌

比去年简单,发现没有什么好优化的,就直接写了。

#include <bits/stdc++.h>
using namespace std;
int n,numn=52,m;
char a,b;
char a1[10]={0,'D','C','H','S'},b1[20]={0,'A','1','2','3','4','5','6','7','8','9','T','J','Q','K'};
struct p{
    char a,b;
    bool c=true;
}p[60];
int main(){
    freopen("poker.in","r",stdin);
    freopen("poker.out","w",stdout);
    for(int i=1;i<=4;i++){
        for(int j=1;j<=13;j++){
            m++;
            p[m].a=a1[i];
            p[m].b=b1[j];
        }
    }
    cin>>n;
    for(int z=1;z<=n;z++){
        cin>>a>>b;
        if(a=='D'){
            for(int i=1;i<=13;i++){

                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='C'){
            for(int i=14;i<=26;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='H'){
            for(int i=27;i<=39;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='S'){
            for(int i=40;i<=52;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
    }
    cout<<numn<<endl;
    return 0;
}

测试样例,发现最后一个样例错了,才发现 b1 初始化写错了。

#include <bits/stdc++.h>
using namespace std;
int n,numn=52,m;//numn指剩余卡牌数 
char a,b;
char a1[10]={0,'D','C','H','S'},b1[20]={0,'A','2','3','4','5','6','7','8','9','T','J','Q','K'};//做预处理用的数组 
struct p{//存放所有卡牌的属性 
    char a,b;
    bool c=true;
}p[60];
int main(){
    freopen("poker.in","r",stdin);
    freopen("poker.out","w",stdout);
    for(int i=1;i<=4;i++){//预处理 
        for(int j=1;j<=13;j++){
            m++;
            p[m].a=a1[i];
            p[m].b=b1[j];
        }
    }
    cin>>n;
    for(int z=1;z<=n;z++){
        cin>>a>>b;
        //下面挨个比较花,然后在比较数值,标记该卡片,减少剩余卡牌数量 
        if(a=='D'){
            for(int i=1;i<=13;i++){

                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='C'){
            for(int i=14;i<=26;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='H'){
            for(int i=27;i<=39;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
        if(a=='S'){
            for(int i=40;i<=52;i++){
                if(b==p[i].b&&p[i].c){
                    p[i].c=false;
                    numn--;
                }
            }
        }
    }
    cout<<numn<<endl;//输出剩余卡牌数量 
    return 0;
}

测试样例发现没问题,就切下一道题了。

T2 地图探险

第一眼看了样例,以为是BFS,看完才发现就是小模拟。

首先对于每组数据,先看 d 的值,储存行走后的坐标,直接看坐标的位置是否是 . 或者是 被标记的位置。如果是,如果是 . 增加格数,标记位置,把实际位置移到行走后的坐标;如果是 被标记的位置,把实际位置移到行走后的坐标就可以了。否则把 d 的值加 1 后取模。

#include<bits/stdc++.h>
using namespace std;
char a[1005][1005];
int t,n,m,k,x01,y01,d,x10,y10,num=1;
int main(){
    freopen("explore.in","r",stdin);
    freopen("explore.out","w",stdout);
    cin>>t;
    for(int z=1;z<=t;z++){
        memset(a,0,sizeof(a));//清空数组 
        num=1;//1算上起点的一个位置 
        cin>>n>>m>>k>>x01>>y01>>d;
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];
        for(int i=1;i<=k;i++){
            if(d==0){//判断不同方向走向的位置 
                x10=x01;
                y10=y01+1;
            }
            if(d==1){
                x10=x01+1;
                y10=y01;
            }
            if(d==2){
                x10=x01;
                y10=y01-1;
            }
            if(d==3){
                x10=x01-1;
                y10=y01;
            }
            if(a[x10][y10]=='.'||a[x10][y10]=='w'){//判断将走向的位置是否可以行走 
                if(a[x10][y10]=='.'){//没走过 
                    num++;
                    a[x01][y01]='w';//标记走过的位置 
                    x01=x10;
                    y01=y10;
                }
                if(a[x10][y10]=='w'){//走过 
                    x01=x10;
                    y01=y10;
                }
            }
            else d=(d+1)%4;
        }
        cout<<num<<endl;
    }
    return 0;
}

测试发现最后两个样例没有全过,发现代码没啥问题就切下一道题了,到最后还是没想出错哪了。 最后测洛谷发现只拿了50分。

T3 小木棍

只想骗分,随便写了一点。

#include <bits/stdc++.h>
using namespace std;
int a[100005],n;
int main(){
    freopen("sticks.in","r",stdin);
    freopen("sticks.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        cout<<"-1"<<endl;
    }
    return 0;
}

洛谷测试发现竟然爆零了。

T4 接龙

看了一眼,根本不会写,直接放弃了。

考试结束。

1:30 坐车,回家。