一、比赛时一定要看清比赛题目
在我两年参与了四次的比赛中,绝大多数出错与测试输出不符都是因为大概看题后感觉题目简单或是有一点思路,就直接上手写代码。当代入测试数据的时候才发现错误,往往此类错误在审题的时候都可以避免。比赛中最重要的就是先仔细阅读题目找出可能会有的坑,再开始写代码,可以节省很多时间也可使代码不会经过多次修改bug看起来冗余。
二、把握比赛时间不要死磕
蓝桥杯比赛一共10题(直接填答案题5 + 编程题5题),分值分别为5,5,10,10,15,15,20,20,25,25。比赛时间一共为4小时。可见前面五道填答案题最高才15分,编程题最低都有15分。所以前面填空题如果难算并不需要纠结,直接跳过就好。一般能写两道填空题加一道半编程题都可以在省赛获得奖。
三、能暴力的题就不要想得很复杂
若是遇到比较难的题,如最后两题。一般最后两题都是有可以暴力破解的方法可以通过一部分数据的,如果觉得时间和能力不够,就直接暴力破解不需要仔细深究时间复杂度和空间复杂度问题。在比赛中就做到尽可能拿分就好,编程题并非测试数据通过就一定能得满分。可能会存在测试用例没有覆盖到的数据,或者测试超大数据,算法不够好的话复杂度太高也会出现部分数据不能通过。如果时间足够的话就可以考虑一下特殊数据或者大数据能否通过,进而优化自己算法。如果时间不够,直接暴力破解(如:多重嵌套循环)不需要考虑那么多。
四、高频出现的算法、比赛技巧及模板
参加蓝桥杯的同学一定要把历年真题自己去写一遍,可能初学算法的同学看比赛题会有些难度,但是如果能专研比赛试题的算法和进行总结,通过练习两三套真题想要获得一个省赛将一定不难。以下是我通过从15年到20年省赛与国赛题所得出的总结。
1.排序算法
- 最常见,也是大一学生算法小白最浪费时间的去写的算法
- 在比赛中尽量使用Java,C++自带的排序算法,此类算法平均效率比初学者所学的冒泡排序和选择排序算法高,也可以减少很多写代码的时间。
//在java中实现自带快速排序
int[] x = {
9,6,3,8,5,2,7,4,1,0};
Arrays.sort(x); //只需把需要排序的数组放进去就行
//在c++中使用模板函数sort()
int x[10]= {
9,6,3,8,5,2,7,4,1,0};
sort(x,x + 10);
- 也可根据题意自行写出对于此题效率更高的算法,如:桶排序,归并排序等。对于蓝桥杯比赛自带的排序算法一般就住够用了。
2.全排列
- 全排列几乎在每年的比赛中都有出现。
- 全排列的定义为
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1),如1,2,3三个元素的全排列为:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
共3 * 2 * 1 = 6种
- 算法模板(以18年Java组国赛"最大乘积"为例)
//全排列:(递归回溯生成全排列,适用于无重复元素的情况)(考虑第k位,前面已经排定)
//2019决赛最大乘积
//伪代码,作为模板学习
int[] a; int n; f(0);
public static void f(int k){
if(k == n){
//一种全排列已经产生
if(check()){
ans++;
}
return;
}
for(int i = k; i < n; i++){
{
int t = a[i]; a[i] = a[k]; a[k] = t;}
f(k + 1);
{
int t = a[i]; a[i] = a[k]; a[k] = t;}
}
}
3.数据结构
- 选择合适的数据结构解题可以提高算法效率,减少代码复杂度。
- 若要想取得比较好的成绩, 必须熟悉几种数据结构
//比赛中常用的数据结构(Java)
Hashmap //最常用
ArrayList //可以替代数组,底层为可动态扩容数组
Queue //队列,bfs算法时使用
Deque Stack //栈
...
4.String
- Java组中的比赛最喜欢考的就是字符串的一些操作,如果不是很了解String中的一些方法,自己实现方法会比较耗时。一下列出几种常用方法。若比赛中忘记方法名或者用法,可以直接查看API文档。
//String类的常用方法:
boolean conta