Junie's Blog

蓝桥杯经验分享

全文共 1278预计阅读 5 分钟

自我介绍

竞赛经历

蓝桥杯:

  • 大一 C/C++ 组省二
  • 大二 Java 组国一
  • 大三 Python 组国一

天梯赛:个人国三

经验分享

牢记赛制

蓝桥杯是OI 赛制(提交后看不到结果,最后按通过的测试点给分)。

这场比赛不仅仅是拼算法基本功,更是拼比赛策略心态管理工程习惯

先暴力再优化

在 OI 赛制中,“不完美的正确”远比“完美的错误”有价值。

先拿分,求心安

拿到任何一道题,哪怕你一眼看出了最优解,如果实现起来很复杂(比如复杂的数据结构),也务必先花几分钟写一个最无脑的暴力版本提交上去。

按数据范围拿分

题目的测试数据是分级的。比如 N105N \le 10^5 需要 O(NlogN)O(N \log N) 的算法,但如果有 30%30\% 的数据 N1000N \le 1000,那你写个 O(N2)O(N^2) 的暴力双重循环就能稳稳拿下这 30%30\% 的分数。

优化后也别抛弃原来的代码

每个测试点是独立的,所以可以先写个判断——当前测试数据是否能暴力通过。

n = input()
 
if (n <= 1000) :
	solve_1()
else:
	solve_2()

学会骗分

遇到毫无头绪的题怎么办?千万别空着!

特判拿分(if-else)

仔细看题目描述,有没有什么极端情况或特殊设定?比如题目问是否存在一条路径,如果图是一条直线,答案是不是显而易见的?直接写 if 判断特殊情况,输出答案。

盲猜答案

如果题目要求输出 YesNo,或者求某种最大值找不到时输出 -1。直接 print("Yes")print(-1),在随机测试点中,大概率能骗过 5%5\%10%10\% 的测试用例。

小数据找规律

如果遇到复杂的数学题,可以试着用代码把前 10 项的结果硬算出来打印在屏幕上,说不定就能肉眼看出一个数列规律(比如斐波那契、等差数列),然后直接用公式 O(1)O(1) 解决。

避免死磕

题目并不是严格按照难度升序排列!

全局观

比赛刚开始,一定要把所有题目浏览一遍。有时候第 6 题是一道极其恶心的大模拟题,而第 9 题可能只是一道你做过无数遍的模板题。

真实的案例

我曾经在 Java 国赛时,发现最后一题题目描述很复杂,但写个暴力的三重循环就能拿 16 分,估计很多人都没读题。

止损策略

给每道题设定一个“死磕上限”(比如 30 分钟)。如果在某道题上卡了超过这个时间,立刻标记、放下,去做下一题。

巧用库函数

标准库是你最可靠的战友。熟练掌握语言自带的内置库,不仅能大幅节省敲代码的时间,还能避免手写复杂逻辑时产生的 Bug。

比如 Python 中的:

import itertools
import math
import bisect
 
# --- 组合与排列 ---
itertools.combinations(iterable, r) # 生成所有组合,常用于子集枚举
itertools.permutations(iterable, r) # 生成所有排列,常用于全排列暴力搜
 
# --- 数学计算 ---
math.comb(n, k) # O(1) 计算组合数 C(n, k)
math.perm(n, k) # 计算排列数 A(n, k)
math.gcd(a, b)  # 求最大公约数
math.lcm(a, b)  # 求最小公倍数
 
# --- 算法辅助 ---
bisect.bisect_left(a, x) # 二分查找,找第一个大于等于 x 的位置

补充建议:如果是 C++ 选手,一定要熟练掌握 STL(如 next_permutation, lower_bound, sort);Java 选手要熟悉 CollectionsArrays 工具类。

习惯性备份

考场上的突发状况永远比你想象的离谱。

防重启

考场机房的电脑为了方便管理,很多都装了“还原卡”。我曾经遇到过中途机房电脑全部自动关机重启的情况——如果你把代码保存在了桌面或 C 盘,重启后直接消失。务必在一开始就把工作目录建在非系统盘(如 D 盘或 E 盘)。

版本控制(手动版)

重写一道题或者进行大改时,千万不要在原代码上直接删改! 养成习惯:把旧代码重命名为 A_1.py 保存下来,新建一个 A_2.py 再写。避免出现会出现“改了半小时发现思路全错,想退回原本能跑通的暴力版本却找不到了”的情况。

学会文件读写

蓝桥杯的题目通常是一个 PDF 文件。

格式陷阱

PDF 复制经常会带入不可见的特殊字符,或者把多行挤成一行,导致你的输入读取逻辑直接崩溃。

文件重定向大法

强烈建议在本地建一个 input.txt,把样例手动输进去(或者小心粘贴并检查格式),然后用重定向读取。这不仅能避免格式错误,还省去了每次运行都要重新粘贴测试数据的麻烦。

比如 Python 中,只用在开头加上(C++ 选手可以用 freopen):

import sys
 
# 将标准输入输出重定向到文件
sys.stdin = open('input.txt', 'r') 
sys.stdout = open('output.txt', 'w') 
 
# ... 你的主逻辑代码 ...
警告

在最终通过系统提交代码前,一定要把这两行重定向代码注释掉或删掉! 否则你的代码在评测机上会因为找不到文件或无法读取标准输入而喜提 0 分。

熟悉赛时 IDE

Python 要求使用 IDLE,Java 要求 Eclipse,建议先在自己电脑上熟悉一下基本操作,包括但不限于:

  • 运行和调试
  • 改字体/字体大小
  • 查手册(看函数用法)
  • 开自动补全

评论