当前位置:   article > 正文

CSP 2022 游记_游记csdn

游记csdn

本文章来自一名希望能拿一等的小六。

初赛篇

我学习算法和 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 1a,b109,并且自己也没有提前背快速幂模板,当时就慌了。再次思考后,我突然想到可以特判 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

到第二题,我一看到题就知道是推数学的,但我不到该怎么推,也没有想过用二分。写了个暴力,本来预计 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

第三题整整卡了我一个半小时,这也是我本次考试最大的败笔。我写了一个不算搜索的搜索,结果其实和骗分没有区别。当时真的十分着急,但字符串的知识不熟让我只能干着急。

#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;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

到了第四题就只剩半小时了,当时一直不知道哪里会 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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

我考完之后已经十分疲惫,然后我妈此时还打来电话说我PET 139 139 139 分,差一分过。我当时真的崩了呀。

总的来说,我这一次不仅没有经验,而且在算法熟练度和思维以及时间的管控都有待提升(翻译:差的要死) 。

后面查到分数,有 160 160 160 分,这个分数在我的意料之中,没有任何波澜。到了17号当天,我还是查了一下分数线,GD这边的一等线是 225 225 225 ,感觉已经算低的了。但是我刚好到了全国一等基准线,也算是“上帝”给我的一种安慰吧。

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

闽ICP备14008679号