赞
踩
我学习算法和 C++ 是相当晚的,C++ 是在 CSP考前 76 76 76 天学的,而算法则更晚。在8月份的时候,我还参加了一个叫 “希望编程” 的比赛,拿了三等奖(现在看来这些都是送分题)。我的暑假其实还算可以了,至少比 9月份的生活好。
9月份开学了,而距离CSP就只有 18 18 18 天了。然后,我妈给我买了一本《信奥一本通》。让我一直刷,复习,再刷。我当时还是很感兴趣的,也听着她的话再刷。当时确实很累,学校那烦人的作业已经耗掉我大半的精力了,回到家里的第一件事还是刷题。不过我当时并没有感到厌倦,反而越刷兴致越高。就这样我刷掉了《信奥一本通》15套模拟卷+历年真卷3套+某谷模拟卷1套。现在想起来都感觉很累,但就是不知为何当时能感觉不错。
那一天终究还是来了,我走到考场里,强迫自己冷静下来。老师把试卷发了下来,我看了看:还好,还算简单,大概能拿个 60 60 60 吧。尽管阅读题还是有点难,但我根本不慌。
随着一声铃响,考试正式开始。我首先有
30
30
30 分钟秒了第一大题(还好没有“吃人”的计算机原理、网络常识和小学奥数),稍微检查了一遍,觉得至少对
10
10
10 题。然后再看到阅读题,阅读题的第一题就差点把我给难倒,但是我在没有理解题目是嘛的情况下(当时我还认为 0x
是八进制),依旧对了两三道道判断和一个选择。然后再看到第二和第三题(这两题差点把我的心态搞崩),但是到最后还是写了几个自己会的。此时还剩一个半小时了,我的心十分紧张,知道我看到了完型,差点没忍住笑出来。用
15
15
15 分钟完成了第三大题,预计满分(当时我甚至还不知道“搜索”是什么意思,但根本不影响满分)。最后,我再改了几个答案,检查完无误后,结束铃正好想了起来。
(我旁边还有一个五年级的,一边玩草稿纸纸飞机一边写,还不用草稿纸,两个全写完。写完后还把草稿纸折成纸枪。)
后面就是等成绩了。一周后,我终于在连续 5 5 5 个小时的搏斗中查到了分数: 71 71 71 分!这对我来说已经算高的了,在“0基础”(其实也不是“0基础”,学过一年的Python,但只是学了关于自动化、数据库开发、游戏开发、网络爬虫、Flask等,没有学算法)的情况下,依旧拿到了 71 71 71 分的好成绩!
国庆节当天,广东开放了查分数线。我在查成绩之前和老爸说过,要是我没过就不过生日了(我生日是 9.28)。然后一查,分数线是 69.5 69.5 69.5 ,当时我高兴得跳了起来,后面问了一些人才知道,那次很多人都是 69 69 69 ,包括练习时长两年半的,无缘复赛。
接下来就是复赛了!
我的复赛可以说是一塌糊涂,从任何方面来讲。写真题的时候几乎没有出现过达到当年一等线的,CSP2019也就 240 240 240 分,20年 230 230 230 ,21年题简单一点,拿了 322 322 322 分。而且我的备赛态度极其恶劣,每天就是刷刷B站,打打游戏而已。
到了考场上,我还是比较轻松的。毕竟21年的题也不难,22年的题应该也不会太难。
考试开始。首先翻了翻第一题,看了一下数据范围就不会了。看了一下
1
≤
a
,
b
≤
1
0
9
1 \leq a, b \leq 10^9
1≤a,b≤109,并且自己也没有提前背快速幂模板,当时就慌了。再次思考后,我突然想到可以特判
a
=
1
a=1
a=1 的情况 ,这样即使
a
=
2
,
b
=
1
0
9
a=2,b=10^9
a=2,b=109 也不会超时。我大喜过望,用了约
10
10
10 分钟便很快写好了,打好 freopen
后测试完,总共用了半个小时。
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e9; long long a, b, ans; int main(){ freopen("pow.in", "r", stdin); freopen("pow.out", "w", stdout); scanf("%d %d", &a, &b); if (a == 1){ printf("1"); return 0; } ans = a; for (int i=1; i<b; i++){ ans *= a; if (ans > MAXN){ printf("-1"); return 0; } } printf("%lld", ans); return 0; }
到第二题,我一看到题就知道是推数学的,但我不到该怎么推,也没有想过用二分。写了个暴力,本来预计 60 60 60 的,但是没有判断整除。大样例运行了 18 18 18 秒,但我依然无所畏惧。
#include <bits/stdc++.h> using namespace std; int k; long long n, e, d, p, q; bool ok; int main(){ freopen("decode.in", "r", stdin); freopen("decode.out", "w", stdout); scanf("%d", &k); for (int i=1; i<=k; i++){ scanf("%lld %lld %lld", &n, &e, &d); p = 1; ok = false; while (p*p <= n){ q = n / p; if (d*e == (p-1) * (q-1) + 1){ printf("%lld %lld\n", p, q); ok = true; break; } p++; } if (!ok) printf("NO\n"); } return 0; }
第三题整整卡了我一个半小时,这也是我本次考试最大的败笔。我写了一个不算搜索的搜索,结果其实和骗分没有区别。当时真的十分着急,但字符串的知识不熟让我只能干着急。
#include <bits/stdc++.h> using namespace std; int cnt1 = 0, cnt2 = 0; bool v; string expr; bool computing(string expr){ int ind1, ind2; bool v, c; while (expr.find('(') != expr.npos){ c = false; for (int i=0; i<int(expr.size()); i++){ if (expr[i] == '('){ ind1 = i; }else if (expr[i] == ')'){ ind2 = i; expr.replace(ind1, ind2-ind1+1, to_string(computing(expr.substr(ind1+1, (ind2-1) - ind1)))); c = true; } if (c) break; } } bool a, b; while (expr.find('&') != expr.npos){ c = false; for (int i=0; i<int(expr.size()); i++){ if (expr[i] == '&'){ a = (expr[i-1] - '0'); b = (expr[i+1] - '0'); if (!a) cnt1++; expr.replace(i-1, 3, to_string(a&&b)); c = true; } if (c) break; } } while (expr.find('|') != expr.npos){ c = false; for (int i=0; i<int(expr.size()); i++){ if (expr[i] == '|'){ a = (expr[i-1] - '0'); b = (expr[i+1] - '0'); if (a) cnt2++; expr.replace(i-1, 3, to_string(a||b)); c = true; } if (c) break; } } return expr[0] - '0'; } int main(){ freopen("expr.in", "r", stdin); freopen("expr.out", "w", stdout); cin >> expr; if (expr.size() == 5){ if (expr[1] == '&'){ if (expr[3] == '&'){ if (expr[0] == '0') cnt1++; v = (expr[0] - '0') && (expr[2] - '0'); if (!v) cnt1++; v = v && (expr[4] - '0'); }else{ if (expr[0] == '0') cnt1++; v = (expr[0] - '0') && (expr[2] - '0'); if (v) cnt2++; v = v || (expr[4] - '0'); } }else{ if (expr[3] == '&'){ if (expr[2] == '0') cnt1++; v = (expr[4] - '0') && (expr[2] - '0'); if (expr[0] == '1') cnt2++; v = (expr[0] - '0') || v; }else{ if (expr[0] == '1') cnt2++; v = (expr[0] = '0') || (expr[2] - '0'); if (v) cnt1++; v = v || (expr[4] - '0'); } } printf("%d\n%d %d", v, cnt1, cnt2); }else{ cout << computing(expr) << endl; printf("%d %d", cnt1, cnt2); } return 0; }
到了第四题就只剩半小时了,当时一直不知道哪里会 RE ,到了考试的最后一秒也没有调出来,而且 cmp
函数也写错了,再加上调试代码也没有删掉……最后才知道是scanf
没有加左值引用,警种敲烂!!
#include <bits/stdc++.h> using namespace std; #define MAXN 501 struct Point{ int x, y; }points[MAXN]; bool cmp(Point a, Point b){ if (a.x == b.x) return a.y > b.y; return a.x > b.x; } int n, k; int main(){ freopen("point.in", "r", stdin); freopen("point.out", "w", stdout); scanf("%d %d", &n, &k); printf("2\n"); if (k == 0){ for (int i=1; i<=n; i++) scanf("%d %d", points[i].x, points[i].y); sort(points+1, points+n+1, cmp); printf("1\n"); int m = 1, now = 1; for (int i=1; i<n; i++){ if ((points[i].x == points[i+1].x - 1 && points[i].y == points[i+1].y) || (points[i].y == points[i+1].y - 1 && points[i].x == points[i+1].x)) now++; else m = max(m, now), now = 1; } printf("%d", m); }else{ printf("%d", n+k); } return 0; }
我考完之后已经十分疲惫,然后我妈此时还打来电话说我PET 139 139 139 分,差一分过。我当时真的崩了呀。
总的来说,我这一次不仅没有经验,而且在算法熟练度和思维以及时间的管控都有待提升(翻译:差的要死) 。
后面查到分数,有 160 160 160 分,这个分数在我的意料之中,没有任何波澜。到了17号当天,我还是查了一下分数线,GD这边的一等线是 225 225 225 ,感觉已经算低的了。但是我刚好到了全国一等基准线,也算是“上帝”给我的一种安慰吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。