当前位置:   article > 正文

CSP-J/S认证 2023游记_csp-j2023游记

csp-j2023游记

初一,SH,第一次线下参赛,菜鸡选手。

万恶的CCF组织……

提示:

        非void函数一定要return!

        非void函数一定要return!

        非void函数一定要return!

否则,O2优化后果:       

        CE、RE、MLE、TLE、WA……

        J2:

                305分 -> 205分

        S2:

                140分 -> 40分

Ade,我的一等奖!Ade,我这一年的努力!

——鲁迅《从自信满满到直接爆零》

初赛

考试时高烧39°,好吧。

初赛也不是怎么很重要,尽量考到个过线就行了,没怎么复习。

 J84 S49 勉强勉强(居然还过了)

J1

普及组我们考场树的遍历那道题改了两次,害我前面折腾了12mins(居然有认为一个答案太明显,再改一次的,考试一个多小时了才改,也真是绝了,令人不由叹服)

考试时发昏,居然哈夫曼编码那道题最后琢磨25% 30% 45%谁大谁小,结论45%和25%一起,30%单独,结果没这个选项,随便选一个B,光荣扣分。

阅读程序J组比较简单,程序填空好像连环错了不少。

  1. // 题目代码
  2. int edit_dist_dp(string str1, string str2) {
  3. int m = str1.length();
  4. int n = str2.length();
  5. vector<vector<int>> dp(m + 1, vector<int>(n + 1));
  6. for (int i = 0; i <= m; i++) {
  7. for (int j = 0; j <= n; j++) {
  8. if (i == 0)
  9. dp[i][j] = ①;
  10. else if (j == 0)
  11. dp[i][j] = ②;
  12. else if (③)
  13. dp[i][j] = ④;
  14. else
  15. dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤);
  16. }
  17. }
  18. return dp[m][n];
  19. }

见过离谱的没见过这么离谱的,算法竞赛谁会把dp数组开vector套vector,算你二阶张量学的挺好是吧,真是欺负人啊……

不可救药的民族中,一定有许多英雄,专向孩子们瞪眼。这些孱头们!孩子们在瞪眼中长大了,又向别的孩子们瞪眼。

——鲁迅

S1 

下午继续高烧,比分数线高那么一点,擦线通过,侥幸侥幸。

上来Linux、排列组合,马马虎虎,第三道直接比较时间复杂度,考场上直接极限运算,出的不得不让人叹为观止,不过可喜的是,仍然尽心尽力地给广大学子出了个θ而不是O

小明准备参加2022年的CSP-J/S第一轮认证, 在琢磨计数排序,基数排序和桶排序的区别, 以及研究O(n inf+1)这个无限还带常数的不标准大O复杂度之时, 转瞬间,一望无际的天空被撕裂出了一道巨大的口子,顿时电闪雷鸣, 他被一道来自外太空的暗紫色宇宙射线击中, 因此和车牌上的O和I一起, 来到了一个这个有趣的考场。

——2022CSP第一轮有感

第11道题考g++使用的,在糟糕IDE——DevC++的精心呵护下,我从未用过终端编译,从未用过Linux,不得不说,这估计也就是复赛我int f()不写return 0的主要导火索。

第14题最后统计没有用16进制,-2;第15题最后终于检查出来,我还纳闷呢,这么简单的模板是S组选择压轴?糊弄人呢。考试前最后我才检查出来,CCF为了出题,这种脑筋急转弯已经是层出不穷了,没事,去年(22年)的改掉的这道题似乎更搞笑一点:

  1. int i, j, k = 0;
  2. for (i = 0; i < n; i++) {
  3. for (j = 0; j < n; j*=2) {
  4. k = k + n / 2;
  5. }
  6. }

不是吗?

完善程序和阅读开始瞎做,最后30分完善拿了3分,我随便全蒙一个字母貌似还多对一点,其实这次的确是简单的,2021年S组就吓人了:

(2) ( RMQ 区间最值问题) 给定序列{a0​,⋯,an−1​}, m 次询问,每次询问给定 l,r,求max{al​, ...,ar​}。

为了解决该问题,有一个算法叫 the Method of Four Russians ,其时间复杂度为 O(n+m) 

——2021年S1

听都没听过,还有如下:

A. 求圆的面积并

B. 求球的体积并

C. 求球的体积交

D. 求椭球的体积并

——2021年S1

另外你acos1/2写成pai/3会怎么样吗?

综上所述,今年除了如下已经很良心了。

  1. std::vector<int> pre(a + mid, a + r);
  2. std::vector<long long> sum(r - mid + 1);

(莫名其妙的码风)

复赛考前

趁着还有的那些时间,又赶忙复习了下,可惜我只记得main函数别漏写return0,天公不作美,不知道其他函数漏写return0仿佛更重要一点。

floyd、dijkstra ✔(没用上)

kruskal ✔(没用上,prim早忘了)

图、树的遍历 ✔(没用上)

前缀和与差分、树状数组、线段树、ST表、倍增、分块……一干RMQ、RSQ ✔(没用上)

区间DP ✔(用上了,然后T2我能想到栈像括号匹配那么O(n^2)做能得50分的得了O(n^3)的35分)

DFS、BFS ✔(用上了,T1爆零了)

string的操作 ✔(没用上)

一大堆stl ✔(没用上)

我真是悲催+倒霉……

复赛 

尽管我已是非常仔细地检查了所有可能爆零的地方,可惜人算不如天算,还是有非void函数没写返回值(准确的说我以前都不知道这事,希望解答)。

J组自我估分

100 100 100 10

实际(民间估分)

100 95 0 10

S组自我估分

100 35 15 0

实际(民间估分)

0 35 5 0

这就是void函数不写返回值的问题,可惜我uqe和lock还检查了好几遍,变了不少样例。

我确信我已发现了一种AC的做法,可惜这里的空白太少(下一篇再说),写不下。

爆零的代码:

uqe.cpp

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int maxn = 4e3+7;
  5. int n, m;
  6. int qpow(int a, int b) {
  7. if(b == 0) return 1;
  8. int tmp = qpow(a, b / 2);
  9. if(b & 1) return tmp * tmp * a;
  10. else return tmp * tmp;
  11. }
  12. int gcd(int a, int b) {
  13. if(b == 0) return a;
  14. else return gcd(b, a % b);
  15. }
  16. int ta, tb, qa, qb, tl;
  17. string dv(int a, int b, bool chk) {
  18. if(b < 0) a = -a, b = -b;
  19. if(a == 0) {
  20. if(chk) ta = 0, tb = b;
  21. else qa = 0, qb = b;
  22. return "0";
  23. }
  24. int g = gcd(a, b);
  25. a /= g, b /= g;
  26. if(b < 0) a = -a, b = -b;
  27. if(chk) ta = a, tb = b;
  28. else qa = a, qb = b;
  29. if(b == 1) return to_string(a);
  30. else return to_string(a) + "/" + to_string(b);
  31. }
  32. string sq_div(int a, int b) {
  33. if(a == 0) {
  34. ta = a;
  35. tb = b;
  36. tl = 1;
  37. return "0";
  38. }
  39. int k = 1, l = 1;
  40. int ca = a;
  41. for(int i=2; i*i<=ca; i++) {
  42. int tmp = 0;
  43. while(a % i == 0) tmp++, a /= i;
  44. k *= qpow(i, tmp / 2);
  45. l *= qpow(i, tmp - tmp / 2 * 2);
  46. }
  47. l *= a;
  48. string t = dv(k, b, true);
  49. tl = l;
  50. if(l == 1) return t;
  51. else if(ta == 1 and tb == 1) return "sqrt(" + to_string(l) + ")";
  52. else if(ta == 1) return "sqrt(" + to_string(l) + ")/" + to_string(tb);
  53. else if(tb == 1) return to_string(ta) + "*" + "sqrt(" + to_string(l) + ")";
  54. else return to_string(ta) + "*" + "sqrt(" + to_string(l) + ")/" + to_string(tb);
  55. }
  56. int test(int a, int b, int c) {
  57. if(a < 0) a = -a, b = -b, c = -c;
  58. if(b*b-4*a*c < 0) cout << "NO" << endl;
  59. else if(c == 0) {
  60. if(a*b > 0) cout << "0" << endl;
  61. else cout << dv(-b, a, false) << endl;
  62. }
  63. else {
  64. string q = dv(-b, 2*a, false);
  65. string p = sq_div(b*b-4*a*c, 2*a);
  66. if(tl == 1) {
  67. int p = qa * tb + qb * ta;
  68. int q = qb * tb;
  69. cout << dv(p, q, false) << endl;
  70. } else {
  71. if(q == "0") cout << p << endl;
  72. else if(p == "0") cout << q << endl;
  73. else cout << q << '+' << p << endl;
  74. }
  75. }
  76. }
  77. signed main() {
  78. cin.tie(0), cout.tie(0);
  79. cin >> n >> m;
  80. for(int i=1, a, b, c; i<=n; i++) {
  81. cin >> a >> b >> c;
  82. test(a, b, c);
  83. }
  84. return 0;
  85. }

(test函数返回值)

lock.cpp

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10;
  4. int n;
  5. int stat[maxn][7];
  6. int v[7];
  7. int ans;
  8. int dis(int a, int b) {
  9. return ((a - b) % 10 + 10) % 10;
  10. }
  11. int chk() {
  12. for(int i=1; i<=n; i++) {
  13. int difs = 2, ok = true, crt = true;
  14. for(int j=1; j<=5; j++) {
  15. if(!ok) difs -= 1;
  16. if(stat[i][j] != v[j]) {
  17. if(difs == 1 && dis(v[j], stat[i][j]) != dis(v[j-1], stat[i][j-1])) { crt = false; break; }
  18. if(difs <= 0 and ok == false) { crt = false; break; }
  19. ok = false;
  20. }
  21. }
  22. if(!crt or ok) return false;
  23. }
  24. return true;
  25. }
  26. int dfs(int st) {
  27. if(st == 6)
  28. ans += chk();
  29. else {
  30. for(int i=0; i<=9; i++) {
  31. v[st] = i;
  32. dfs(st+1);
  33. }
  34. }
  35. }
  36. int main() {
  37. cin >> n;
  38. for(int i=1; i<=n; i++) for(int j=1; j<=5; j++) cin >> stat[i][j];
  39. dfs(1);
  40. cout << ans;
  41. return 0;
  42. }

(dfs函数返回值)

有识之士估计已经发现我哪里错了。

另外,我的devc++居然编译选项没调,根本不知道。

J2

这次的题还比较良心,偏简单的,J组T1、T2不说了,T3巨简单(尽管我没写返回值RE)T4没写,估计也写不出来。

这次T3码量不大,分类讨论复杂点,但不需要什么算法,应该没有人不知道辗转相除法求gcd,比去年好,另外,CCF组织是一元二次方程考上瘾了是吧,参见去年J组T2解密,delta=b^2-4ac这是种病,得治。

T3考场上考出根号这一段我貌似还想了很久:

  1. int k = 1, l = 1;
  2. int ca = a;
  3. for(int i=2; i*i<=ca; i++) {
  4. int tmp = 0;
  5. while(a % i == 0) tmp++, a /= i;
  6. k *= qpow(i, tmp / 2);
  7. l *= qpow(i, tmp - tmp / 2 * 2);
  8. }
  9. l *= a;

关于在根号n的时间里把a开成最简根式是否可行,也就是最后剩下来的a是否一定是素数。考场时写的乱七八糟的过程:

证明不存在正数p,q.p^2>n,q^2>n,pq|n.

PF: 采取反证法,若pq|n,则pq<=n,同时(pq)^2>n^2,pq显然大于n,矛盾,原命题得证,QED.

真是叹服……

S2

S组T1纯暴力(尽管我没写返回值TLE/MLE)

考试时我们华二紫竹考场提供Linux虚拟机,当然我一下也没用,DevC++虽然很差劲,但起码比我从来没用过的Vim和Emacs好一点,考试前虚拟机还坏了,还好一位老师帮我调好了,万分感谢!

S组T2好像其实也不难,我居然写了个朴素的区间DP,妄图拿到O(n^3)的分,不过估计35分还是稳的(T1爆零以后也没几分了)

T3好像可以模拟拿点分,但是我把漫长的时间放在T2的优化上了,尽管无功而返,我认为T3我应该是题没有清楚,导致我想拿的前三个测试点只拿了第一个,没事能骗到点都是好的。我还没看过题解,我后来觉得一个struct代表struct,一个struct代表struct xxx的对象是不是能拿到所有特殊ABC的分数。算了,T1都爆零了,往事随风去。

S组T4没有任何考虑的必要。

这次JS偏简单,估计分数线比往年高(JS分别爆零也没有考虑分数线的必要了)

重要的事说三遍

非void函数一定要return!

非void函数一定要return!

非void函数一定要return!

现在才初一呢,来日还有机会,不负光阴,不负韶华,明年再战,不要被Monotonic Queue了,退役之事,还远在天边呢。

等我再研究下题目(下次再爆零就不用研究了),或许会再发几篇题解,学习用,先写到这吧。

愿牛人保佑我,认识的人请在评论区回复。

祝大家不像我这样,别爆零,愿大家都在落幕的CSP中取得好成绩,加油啦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/456979
推荐阅读
相关标签
  

闽ICP备14008679号