CSP2024 游记

Little_x_starTYJ

2024-10-29 15:50:24

Life & Travel

又是一年 CSP。。。

10 月 5 日,终于过 S 初赛了。。。

然后开始漫长的备战。。

在考试开始前 1 day,我还在兢兢业业地学习图论。然后发现没有考。。。

10 月 25 日下午 15:30,来到 CQBS 试机。我想,怎么测试性能呢?于是就打开了 florr 在 xxboyxx 的加持下,florr 连续合成四个红色的,后来他去上厕所,我继续合成,然后就再也没有合成成功了。。。

10 月 26 日上午

来到 CQBS,发现是 4 考场的第一个,当时所有人都到了,感觉自己有点尴尬。

CSP-J2024 开始前

使用 5 分钟敲完快读快写头文件等等。

CSP-J2024 开始了!

然后题目密码还是没发,结果是老师把解压包、题目的密码搞混了。。。神明失去了光。

T1

发现 T1 是最简单的,直接开一个 map,统计不同字符串出现次数,再用 52 减去他不就 A 了?

#include <bits/stdc++.h>
using namespace std;
map<string, bool> m;
signed main() {
    ios::sync_with_stdio(false);
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t, ans = 0;
    cin >> t;
    while (t--) {
        string a;
        cin >> a;
        if (!m[a])
            ans++, m[a] = 1;
    }
    cout << 52 - ans;
    return 0;
}

T2

有种写 bfs 的冲动,但是还是忍住了,于是把 dfs 里面核心代码给拎出来,然后就 A 了。

#include <bits/stdc++.h>
using namespace std;
char a[1010][1010];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
bool vis[1010][1010];
int main() {
    ios::sync_with_stdio(false);
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        int n, m, k;
        cin >> n >> m >> k;
        int x0, y0, d;
        cin >> x0 >> y0 >> d;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> a[i][j], vis[i][j] = 0;
            }
        }
        vis[x0][y0] = 1;
        int ans = 1;
        while (k--) {
            int xx = x0 + dx[d];
            int yy = y0 + dy[d];
            if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] == '.') {
                x0 = xx, y0 = yy;
                if (!vis[xx][yy]) {
                    ans++;
                }
                vis[xx][yy] = 1;
            } else {
                d = (d + 1) % 4;
            }
        }
        cout << ans << "\n";
    }
    return 0;
}

T3

哈哈哈哈,调了我三个小时,哈哈哈哈哈。

首先打了一个假算,然后发现输入 17 输出 228,输入 29 输出 2****,已经忘了。

首先

while (n - 7 > 28) {
    b[++id2] = 8;  //输出序列
    n -= 7;
}

然后 5 个 for。。。暴力枚举前 5 个数字的组合。

#include <bits/stdc++.h>
using namespace std;
int k[100], b[100010];
int main() {
    ios::sync_with_stdio(false);
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    k[0] = k[6] = k[9] = 6, k[1] = 2, k[2] = k[3] = k[5] = 5, k[4] = 4, k[8] = 7;
    while (t--) {
        int id2 = 0;
        int n;
        cin >> n;
        if (n == 1) {
            cout << "-1" << endl;
        } else if (n == 2) {
            cout << "1" << endl;
        } else if (n == 3) {
            cout << "7" << endl;
        } else if (n == 4) {
            cout << "4" << endl;
        } else if (n == 5) {
            cout << "2" << endl;
        } else if (n == 6) {
            cout << "6" << endl;
        } else if (n == 7) {
            cout << "8" << endl;
        } else if (n % 7 == 0) {
            for (int i = 1; i <= n / 7; i++) {
                cout << 8;
            }
            cout << endl;
        } else {
            while (n - 7 > 28) {
                b[++id2] = 8;
                n -= 7;
            }
            string a = "9999999999999999999";
            for (int i = -1; i <= 9; i++) {
                for (int j = -1; j <= 9; j++) {
                    for (int o = -1; o <= 9; o++) {
                        for (int l = -1; l <= 9; l++) {
                            for (int m = -1; m <= 9; m++) {
                                string b = "";
                                int sum = 0;
                                if (i != -1) {
                                    b += i + '0';
                                    sum += k[i];
                                }
                                if (j != -1) {
                                    b += j + '0';
                                    sum += k[j];
                                }
                                if (o != -1) {
                                    b += o + '0';
                                    sum += k[o];
                                }
                                if (l != -1) {
                                    b += l + '0';
                                    sum += k[l];
                                }
                                if (m != -1) {
                                    b += m + '0';
                                    sum += k[m];
                                }
                                if (sum == n && b.size() > 0 && b[0] != '0') {
                                    if (a.size() > b.size())
                                        a = b;
                                    else if (a.size() == b.size()) {
                                        a = min(a, b);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            for (int i = 0; i < a.size(); i++) {
                b[++id2] = a[i] - '0';
            }
            sort(b + 1, b + 1 + id2);
            int kk = 0;
            for (int i = 1; i <= id2; i++) {
                if (b[i] != 0) {
                    kk = i;
                    cout << b[i];
                    break;
                }
            }
            for (int i = 1; i <= id2; i++) {
                if (i != kk) {
                    cout << b[i];
                }
            }
            cout << endl;
        }
    }
    return 0;
}

是不是很暴力?

关于坐我旁边的人

这个人好像很大佬的样子,在我切完 T3 的时候就已经做完 T4 了。(他说就是图论)然后就在旁边玩,不像我,T4 题目都还没读懂。因此他影响了我的心态(他 AK 后就做了某个经典舞蹈中的一个著名动作,所以我就知道他是大佬)。

T4

哈哈哈哈,只有 30min 偷窥 T4 神秘的面纱啦!

赶紧花 5min 写了一个 dfs 暴力,最后调了 20min。。。。

考试结束,请考生立即停笔

笑死,老师让我们乖乖地坐在位置上,哎,还要签字。

没错,这是今年才多出来的流程,在老师征集文件后会将每个代码大小、提交时间等等打印下来,需要你比对是否一致,最后签字,才能离场。

然后也是非常麻烦,硬控我 20min,差点老师就漏掉了我,哼!

10 月 26 日中午

去吃了一个乡村基,但是我想吃的没有了。。呜呜呜。

吃完后去看了看重庆市人民大礼堂。从外面看非常壮观。

此图片来自百度。

进去之后,发现里面全是座位,虽然有 5\sim 6 层,但是还是太高了点。。。往上看是张这样:

此图片来自百度。

一直盯着上面,有一种眩晕的感觉。然后就在座位上坐了下来,本来打算睡觉,结果一直在想 CSP-J2024 预估分数。现在看来应该睡一会儿的。。。但当时的想法是如果我睡了,下午就会想睡觉(毕竟我每次中午午休后,下午考试就一直待机)。

14:03,离开大礼堂,开始返回考点。

14:24,到达机房,赶紧敲头文件等等。

14:30,题目密码准时发下来,比上午好多了。

CSP-S2024 开始,第一次进入 S 的我十分忐忑。

T1

签。为什么别人都用 sort,就我一个人用计数排序?!

T2

脑子抽了,把 \mathcal{O}(T(n + m)) 的正解想成 O(Tnm) 的暴力。然后没打,就一直在调 \mathcal{O}(Tn) 的算法。最后用了 3h,遗憾离场,最后只得了 40pts

T3

dfs,没什么好说的,只有 20pts

关于坐我旁边的人

一个 BS 的,首先他考试的时候敲键盘敲得很大声(据说是一种战术?)严重影响我的思考,并且他把小零食放在桌子下面,每过 15 分钟,弯下腰去食小零食,并且每次都会下座位,然后我又被影响了。

CSP2024 结束了

感觉自己好弱智啊,T2 连 dfs 都没写,关键是 \mathcal{O}(nm) 的 check 都没想到。

但愿能够拿下勾 6。

快祝我蓝勾!