<蓝桥杯软件赛>零基础备赛20周--第2周
报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集
20周的完整安排请点击:20周计划
每周发1个博客,共20周(读者可以按自己的进度选“正常”和“快进”两种计划)。
每周3次集中答疑,周三、周五、周日晚上,在QQ群上答疑:
文章目录
- 0. 第1周答疑
- 1. 常考知识点
- 2. 蓝桥杯怎么判题
- 2.1 判题系统如何判题
- 2.2 测试数据和得分的关系
- 2.3 自己做测试数据
- 3. 备赛计划
- 4. 本周刷题
第 2周(正常2023-10-30,快进2023-10-28): 常考知识点+蓝桥杯怎么判题+备赛计划
0. 第1周答疑
下面是整理的QQ群答疑情况。
问题1:蓝桥杯怎么报名,什么时候报名?
答:集体报名或个人报名。大学一般是指导老师集体报名,例如我校华东理工大学是杨老师统一组织报名。也可以用个人身份报名。报名的具体说明点击:https://dasai.lanqiao.cn/notices/839/
摘录如下:
(一)报名时间。院校报名时间:2023年10月7日——2023年12月15日。
(二)报名人数及方式
1.各参赛学校需为每位参赛选手配备一名指导教师,每名选手的指导教师最多一名,同一名指导教师可指导多位选手。省赛和决赛比赛后指导教师原则上不能更改。
2.报名方式:学校及选手登录蓝桥杯官方网站在线注册并报名。
下面举个例子,是我校的统一报名方法:
2024年蓝桥杯大赛省赛报名方法
(1)登录问卷(我们学校的问卷),填写信息(学号、姓名、性别、手机、学院、系、专业、班级、年级、邮箱、年龄、身份证、是否是学校统一报名、是否缴费)。有的同学系和专业还没确定,先填一个自己想去的系和专业。都要求学校统一报名,不要个人报名。是否缴费,先填否,等我11月15号统一到官网审核后,群里通知,到时麻烦大家及时缴费。
(2)没有账号的同学,先到官网https://dasai.lanqiao.cn/注册一个账号,用自己身份证、学生证、校园卡任何一个都可以,请认真填写每个字段。注册好后,选择自己要参加的比赛,每个同学只能参加一个比赛,因为比赛时间是同一个时间。然后选择院校报名,请不要选择个人报名。选择好院校报名后,等我11月15号审核,11月16号,大家可以到官网去缴费。
(3)每个同学加我校的蓝桥杯QQ群,请实名(班级+姓名),方便联系解决问题。
问题2:参赛报名只能找学校老师统一报名吗?
答:可以学校统一报,也可以个人报。有的学校还有选拔,选上了才给报名。其实如果没选上,也可以用个人身份报名。不过,如果没有通过学校选拔,说明水平不够,自己参加估计也不能得奖。但是,我还是建议不管能不能得奖,大一都报名参赛,目的是以赛促学、积累经验。谁都不能保证第一次参赛就有好的结果。
问题3:比赛时能不能看API帮助文档?
答:可以。点击下面链接,下载蓝桥杯赛场的官方编程环境(2024年第15届):https://dasai.lanqiao.cn/notices/1096/
下载编译器的压缩包,里面有帮助文档。(但是,如果赛场上还要看帮助,那肯定考不好了)
有三种语言的安装包和帮助文档,具体情况是:
(1)学生机比赛环境-C&C++:C&C++帮助文档.chm、devcpp 5.11.exe
(2)学生机比赛环境-Java:eclipse-java-2020-06-R-win32-x86_64.zip、JDK 1.8 API.chm、jdk-8u261-windows-x64.exe
(3)学生机比赛环境-Python:python-3.8.6-amd64.exe
平时编程训练时建议用这些编译器编程,熟悉比赛时的编程环境。
问题4:每年的蓝桥杯,可以同时参加C/C++、Java、Python组的比赛吗?
答:不能。每年只能选一种语言参赛,因为3种语言都是同一天比赛,时间冲突了。
问题5:初学者刚开始学的时候,每题都要看题解正常吗?
答:这很正常。初学者还没有建立计算思维,写代码也不熟练。这个阶段需要通过多看别人的题解和代码,来快速入门。等大概做了100题差不多入门后,后面应该少看题解,尽量靠自己做。自己做1题,比看题解做5题的收获更大。
问题6:在什么题库做题?
答:就在蓝桥杯题库做题:https://www.lanqiao.cn/problems/
洛谷也很好:https://www.luogu.com.cn/
这里也有蓝桥杯历年省赛真题(C/C++、Java、Python,A、B、C、G组都有):http://oj.ecustacm.cn/viewnews.php?id=1021
后面我给的题目基本都在这几个题库。
问题7:蓝桥杯分年级吗?
答:不分年级,大一大二大三大四都参加同一场比赛。研一研二参加研究生组。
问题8:省一才能参加国赛 ?
答:是的。注意,很多学校保研加分时,只算蓝桥杯国赛的奖,不算蓝桥杯省赛的奖。
问题9:A、B、C、G组的难度差别大吗?
答:难度差别不大。参考:2022年第十三届蓝桥杯省赛–难度评价
https://blog.csdn.net/weixin_43914593/article/details/124540569
问题10:“蓝桥杯”的全称是?
答:“蓝桥杯全国软件和信息技术专业人才大赛”,简称“蓝桥杯”:https://dasai.lanqiao.cn/notices/839/
问题11:A、B、C、G组,C/C++、java、Python的比赛题,有重复吗?
答:约有30%的题目是重复的。据说以后出题的趋势是不重复。
1. 常考知识点
省赛涉及的知识点比较基础,考核的是基本的算法思维、基本算法、编码能力。要成功参赛,最重要的是通过大量做基础题目,培养计算思维,提高快速准确的建模和编码能力。
有一些知识点几乎是必考的,因为它们也是整个算法竞赛知识库的基础。
(1)杂题。不需要算法和数据结构,只需要逻辑、推理的题目,难度可难可易。考察思维能力和编码能力,只能通过大量做题来提高。
(2)BFS搜索和DFS搜索,也就是暴力搜索。这是非常基本的算法,是基础中的基础。
(3)动态规划。线性DP,以及一些DP应用,例如状态压缩DP、树形DP等。
(4)简单数学和简单数论。
(5)简单的字符串处理、输入输出。
(6)基本算法,例如排序、排列、二分、倍增、差分、贪心。
(7)基本数据结构。队列、栈、链表、二叉树等。
下面用详细的表格列出常考的知识点,约有60多个。它们是《算法竞赛》中列出的算法大全的300多个知识点中的基础部分。
专题 | 知识点 |
---|---|
基本数据结构 | 链表、队列、优先队列、栈、哈希、二叉树 |
基础算法 | 简单字符串处理、排序(冒泡排序、交换排序、快速排序、归并排序、基尔排序)、打表、枚举、倍增、离散化、前缀和、差分、尺取、分治、贪心、二分 |
搜索 | 基本DFS、DFS记忆化搜索、DFS剪枝、基本BFS、连通性判断、洪水填充 |
高级数据结构 | 并查集、线段树 |
动态规划 | DP问题的性质、编码方法(记忆化递归、递推)、滚动数组;常见线性DP问题:背包问题、最长公共子序列(LCS)、最长递增子序列(LIS)等;状态压缩DP、树形DP、数位DP |
数学 | 模运算、GCD,LCM、素数判定、埃氏筛;排列、组合、二项式定理、杨辉三角、鸽巢原理、斐波那契数列;高精度、快速幂、矩阵乘法、矩阵快速幂;简单几何 |
图论 | 最短路、树的直径、拓扑排序、最小生成树 |
大一零基础的学生,要在几个月内学会这60多个知识点,难度很大。本系列博客《零基础备赛20周》从中再挑出一半知识点进行加强练习,学习量适合这几个月的强度。不能再少了。
2. 蓝桥杯怎么判题
蓝桥杯省赛有10题,2个填空和8个编程。
填空题5分,非对即错,要么0分要么5分。
编程题是怎么打分的?能得一部分分数吗?是的。每道编程题有多个个测试,通过多少测试,就能得多少比例的分数。例如20分的题目,做10个测试,通过3个,就能得6分。
2.1 判题系统如何判题
这里解释一个初学者疑问:在线判题系统(OJ,Online Judge)里面的“判题机器人”如何判定你提交的代码是正确的?
能直接通过看代码的方式,检查代码的每一行逻辑是否正确吗?这几乎是不可能的,因为看别人的代码极其痛苦,往往让人蒙头转向不知所云。即使是常年进行计算机教学的老师也痛苦,考试的时候,像“编码填空”、“程序设计”这样的题目,如果改卷的老师不是用机器验证,而是手批,很难打分。
所以OJ的判题机器人看不懂你的代码,它干脆就不看你的代码,它检验你提交代码的正确性的方法简单粗暴,用黑盒测试:
(1)先准备好标准测试数据,包括输入data.in和对应的输出data.out;
(2)运行你的代码,读入输入数据data.in,产生输出my.out;
(3)如果超出限定时间,代码还没运行结束,也就是没有产生输出,判错;
(4)对比data.out和my.out,如果完全一样,判为正确,否则就判错。
蓝桥杯比赛的判题允许得部分分数。一道题的测试数据中包含多组测试,例如有10组,每组占10%的分数。有的测试数据比较简单,容易通过,让你的代码能够得一些分数。
有新同学问,我写了代码不知对不对,判题系统能把测试的输入输出数据告诉我吗?我好对对答案。对不起,不能。测试数据是判题系统的绝密,绝对不会告诉你它是怎么测试的。如果告诉你了,就是泄题了。因为你可以在代码中什么也不干,而是直接打印输出正确的答案,“蒙骗”判题系统。
2.2 测试数据和得分的关系
下面用一道比较简单的编程题,说明测试数据和得分的关系。
2022年蓝桥杯省赛C/C++语言A组第C题。
求和:https://www.lanqiao.cn/problems/2080/learning/
在我们的OJ上也有这一题:http://oj.ecustacm.cn/problem.php?id=2023
注意题目最后画红线的【评测用例规模与约定】。
下面给出3个代码,分别得到30%、60%、100%的分数。
代码1:30%得分
题目的描述非常直白。大一刚学编程的同学也能做这一题,直接按题目给的公式算,用两个for循环实现。这称为模拟,就是模拟题目的要求,简单直接地编码。
#include<stdio.h>
int a[200010];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) //输入n个数
scanf("%d",&a[i]);
int sum=0;
for(int i=1;i<=n-1;i++) //按题目的公式求和
for(int j=i+1;j<=n;j++)
sum += a[i]*a[j];
printf("%d",sum);
return 0;
}
提交到蓝桥杯网站,返回结果:
代码2:60%得分
把上面的代码做个小小改动,得分立刻就上升到60%。
这个改动就是把 int sum改成long long sum。int的最大值是
2
31
−
1
=
2
×
1
0
9
2^{31}-1=2\times10^9
231−1=2×109。题目说,对于所有评测,有1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。若每个ai都是1000,当n=100000时,sum=
1
0
11
10^{11}
1011,已经远远大于int,导致溢出错误。用long long就没有这个问题,即使n和ai都是最大值,sum也远小于long long的最大值。
#include<stdio.h>
int a[200010];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) //输入n个数
scanf("%d",&a[i]);
long long sum=0;
for(int i=1;i<=n-1;i++)
for(int j=i+1;j<=n;j++)
sum += a[i]*a[j];
printf("%lld",sum);
return 0;
}
但是这个代码仍不能通过100%的测试。因为它的计算量太大,超过了题目要求的“时间限制:1.0秒”。为什么呢?
下面分析代码的计算量,也就是它需要花的时间。现在的普通计算机,一秒大约能计算5000万次。
代码1和2执行了多少步骤?花了多少时间?
代码第9、10行有2层for循环,循环次数是:
n
−
1
+
n
−
2
+
.
.
.
+
1
≈
n
2
/
2
n-1 + n-2 + ... +1 ≈ n^2/2
n−1+n−2+...+1≈n2/2,把计算复杂度记为
O
(
n
2
)
O(n^2)
O(n2)。这称为“大O记号”,在“大O记号”中,常数1/2被忽略了。
对于30%的测试数据,n = 1000,循环次数
100
0
2
/
2
=
50
,
000
1000^2/2 = 50,000
10002/2=50,000。计算时间远远小于题目的时间限制1s,能够通过测试。
对于100%的测试数据,若n = 200000,循环次数
20000
0
2
/
2
=
2
×
1
0
10
200000^2/2 = 2×10^{10}
2000002/2=2×1010。计算时间远大于题目的时间限制1s,超时了,不能通过测试。
上面的讨论称为“时间复杂度分析”。当拿到一个题目时,第一件事就是做复杂度分析,看用什么算法才能满足题目的评测要求。
对应的还有“空间复杂度分析”,就是看代码用到的空间是否超过了题目的限制。本题代码只用到了int a[200010];它需要的存储空间远小于题目的“空间限制:256M”。
一般来说,比赛题的空间限制容易通过,而时间限制是考核的主体。
代码3:100%得分
下面的代码用到了知识点“前缀和”。它的计算量,在12、13行只有一个for循环,循环n次,计算量远小于1秒的5000万次,所以顺利通过测试。“前缀和”这个知识点,在“第9周”的博客中介绍,有兴趣的同学可以先自学。
#include<stdio.h>
int a[200010];
long long s[200010]; //前缀和
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
s[i] = s[i-1]+a[i]; //预计算前缀和
}
long long sum=0; //注意局部变量定义时要初始化为0
for(int i = 1; i <= n; i++)
sum += a[i]*(s[n]-s[i]);
printf("%lld\n", sum);
return 0;
}
通过上面的例子,我们知道了系统是如何判题的。比赛的时候,如果不会100%的方法,也尽量用简单方法得到30%的分数。
据说,有人几乎不会算法,去“裸考”蓝桥杯,每题就用简单方法得到10%~30%的分数,也得到了三等奖。
所以接下来几周我们要大练特练简单方法,用最直白的方法解题,目的是锻炼编码能力,争取做到编码又快又准。
2.3 自己做测试数据
由于判题系统的测试数据是保密的,那我们编完代码,怎么才知道是否能通过测试呢?
如果是平时训练,在蓝桥杯网站上做题,或者在别的什么网站做题,能实时返回判题结果。
但是蓝桥杯比赛并不是实时判题的,而是4小时考完后,蓝桥杯把十几万参赛者的代码收回去,进行赛后判题。所以我们参赛的时候提交的代码,比赛时并不知道对不对。这时候我们可以自己检查,自己编造一些测试数据,然后运行代码,对比是否正确。
普通题目用手算构造输入输出测试数据就行了。如果题目复杂,需要“对拍”,参考博客:Python在竞赛中的应用-测试数据的构造与对拍。这篇博客经整理后也收录在《算法竞赛》的附录中。
3. 备赛计划
算法竞赛除了蓝桥杯,还有ICPC、CCPC。蓝桥杯省赛是普及赛,参加人多得奖人多。蓝桥杯国赛、ICPC、CCPC都是精英赛,参加人少得奖人少。如果想走到蓝桥国赛和ICPC、CCPC,下面是建议。
很多大学生在中学阶段就已经参加过NOI信息学竞赛,或者学习过编程,那么他们已经有了基础,进入大学后投入更多时间、专心地进行编程训练。有这么好的起点,当然是很有优势的。
如果是完全的零基础,也不用担心自己落后。因为,相比已经有了基础的同学,只是晚学了几个月而已,只要多花一些时间,很快就能赶上。对于算法竞赛这样需要2、3年的长周期学习来说,坚持才是最重要的。
由于算法竞赛的艰难和长期性,不管有没有基础,都应该从大一上学期开始学习。
(1)大一上学期,熟悉C/C++、Java、Python语言之一,最好从C/C++开始。一些专业在大一上学期开设编程语言课。有些专业是在大一下学期,这些学生需要自学编程语言。大一上学期,做一些简单的中文题并开始准备蓝桥杯。任务是:进一步熟悉编程语言、学习如何在OJ上做题、掌握输入输出的用法、积累代码量。基本上每个题目,在网上都能搜到题解和代码。初学者可以多看看别人的代码,尽快提高自己的编码能力。另外,最好几个人一起编程,并互相改错。看懂别人的代码、找出别人代码的错误,也是很好的训练,重要性不亚于独立做题。
(2)大一上学期~下学期,做一些入门题,例如搜索、数学、贪心、简单动态规划等。第一次参加蓝桥杯。
(3)大一暑假,参加集训,学习数据结构、深入掌握STL、各种专题入门,熟悉队友。
(4)大二上学期,深入各类专题学习,并制定一年的计划,牢固掌握各种算法知识点。如有可能,在大二上学期参加ICPC区域赛。
(5)大二下学期,第2次参加蓝桥杯。最好能得省一等奖并进入国赛,这样才能顺利走完算法竞赛。
(6)大二暑假,组队参加网络赛和模拟赛。
(7)大三上学期,参加ICPC并获奖。
(8)大三和大四,开始难题、综合题的学习,使自己获得彻底的飞跃,成为“编码大师”,得到蓝桥杯国赛一等奖,ICPC、CCPC的金牌。能获得金牌的队伍,都至少能做出1题以上的难题。难题有三个特征:综合性强、思维复杂、代码冗长。这些难题,是绝大部分学编程的学生难以翻越的大山;能征服大山的竞赛队员,可以称为“杰出”了。
4. 本周刷题
本周刷下面这些题,目的是熟悉编程语言,提高编码速度。
链接请用PC机的浏览器打开,手机打不开。
成绩分析 https://www.lanqiao.cn/problems/497/learning/
合法日期 https://www.lanqiao.cn/problems/541/learning/
时间加法 https://www.lanqiao.cn/problems/548/learning/
扫雷 https://www.lanqiao.cn/problems/549/learning/
大写 https://www.lanqiao.cn/problems/1590/learning/
标题统计 https://www.lanqiao.cn/problems/325/learning/
求和 https://www.lanqiao.cn/problems/1442/learning/
天数 https://www.lanqiao.cn/problems/542/learning/
最大间隙 https://www.lanqiao.cn/problems/543/learning/
金币 https://www.lanqiao.cn/problems/357/learning/
天干地支 https://www.lanqiao.cn/problems/1029/learning/
明明的随机数 https://www.lanqiao.cn/problems/539/learning/
灌溉 https://www.lanqiao.cn/problems/551/learning/
特殊日期 https://www.lanqiao.cn/problems/2408/learning/
最大距离 https://www.lanqiao.cn/problems/155/learning/
最长递增 https://www.lanqiao.cn/problems/158/learning/
串的处理 https://www.lanqiao.cn/problems/287/learning/
幸运数字 https://www.lanqiao.cn/problems/3499/learning
缩位求和 https://www.lanqiao.cn/problems/181/learning/
ISBN号码 https://www.lanqiao.cn/problems/523/learning/
(注:这些题是在蓝桥题库)中选难度“简单”,标签“模拟”找到的。