在我两年参与了四次的比赛中,绝大多数出错与测试输出不符都是因为大概看题后感觉题目简单或是有一点思路,就直接上手写代码。当代入测试数据的时候才发现错误,往往此类错误在审题的时候都可以避免。比赛中最重要的就是先仔细阅读题目找出可能会有的坑,再开始写代码,可以节省很多时间也可使代码不会经过多次修改bug看起来冗余。
蓝桥杯比赛一共10题(直接填答案题5 + 编程题5题),分值分别为5,5,10,10,15,15,20,20,25,25。比赛时间一共为4小时。可见前面五道填答案题最高才15分,编程题最低都有15分。所以前面填空题如果难算并不需要纠结,直接跳过就好。一般能写两道填空题加一道半编程题都可以在省赛获得奖。
若是遇到比较难的题,如最后两题。一般最后两题都是有可以暴力破解的方法可以通过一部分数据的,如果觉得时间和能力不够,就直接暴力破解不需要仔细深究时间复杂度和空间复杂度问题。在比赛中就做到尽可能拿分就好,编程题并非测试数据通过就一定能得满分。可能会存在测试用例没有覆盖到的数据,或者测试超大数据,算法不够好的话复杂度太高也会出现部分数据不能通过。如果时间足够的话就可以考虑一下特殊数据或者大数据能否通过,进而优化自己算法。如果时间不够,直接暴力破解(如:多重嵌套循环)不需要考虑那么多。
参加蓝桥杯的同学一定要把历年真题自己去写一遍,可能初学算法的同学看比赛题会有些难度,但是如果能专研比赛试题的算法和进行总结,通过练习两三套真题想要获得一个省赛将一定不难。以下是我通过从15年到20年省赛与国赛题所得出的总结。
//在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);
公式:全排列数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种
//全排列:(递归回溯生成全排列,适用于无重复元素的情况)(考虑第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;}
}
}
//比赛中常用的数据结构(Java)
Hashmap //最常用
ArrayList //可以替代数组,底层为可动态扩容数组
Queue //队列,bfs算法时使用
Deque Stack //栈
...
//String类的常用方法:
boolean contains(CharSequence s) //当且仅当此字符串包含指定的char值序列时才返回true。
int indexOf(int ch) //返回指定字符在此字符串中第一次出现处的索引。
int length() //返回此字符串的长度。
String[] split(String regex) //根据给定正则表达式的匹配拆分此字符串。
String substring(int beginIndex, int endIndex) //返回一个新字符串,它是此字符串的一个子字符串。(包括beginIndex,不包括endIndex)
char[] toCharArray() //将此字符串转换为一个新的字符数组。
String valueOf(int i) //返回 int参数的字符串 int形式。
//如保留后四位数,则需要%10000
//往往这种题都会跟随者大量的for循环
for(int i = 0; i < N; i++){
sum = (sum + n) % 10000;
}
//此算法需要用到递归,需要考虑图的大小防止栈溢出
int[][] dir = {{1,0},{-1,0},{0,1},{0,-1}};
int[][] map = new int[n][m];
int[][] modelmap = new int[n][m];//模板
public static void dfs(int x, int y){
if(x==n&&y==m)
{
sum++;
return;
}
for(int i = 0; i < 4; i++){
int x1 = x + dir[i][0];
int y1 = y + dir[i][1];
if(x1<=n&&x1>0&&y1<=m&&y>0){
if(map[x1][y1]==1 && modelmap!=0){
modelmap[x1][y1]=0;
dfs(x1,y1);
modelmap[x1][y1]=1;
}
}
}
}
public static void dfs(int[][] g, int i, int j){
g[i][j] = 0;
if(i - 1 >= 0 && g[i - 1][j] == 1) dfs(g, i - 1, j);
if(i + 1 <= 2 && g[i + 1][j] == 1) dfs(g, i + 1, j);
if(j - 1 >= 0 && g[i][j - 1] == 1) dfs(g, i, j - 1);
if(j + 1 <= 4 && g[i][j + 1] == 1) dfs(g, i, j + 1);
}
class{
int x;
int y;
public Node(int x, int y){
this.x = x;
this.y = y;
}
}
public static int[][] dir = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
public static String[][] ans = new String[n][m]; //方向
public static char[][] arr = new char[n][m];//地图
public static int[][] len = new int[n][m];//长度
public static int[][] vis = new int[n][m];//模板
public static void main(String[] args){
bfs(0,0);
System.out.println(len[n][m]);
}
public static void bfs(int x, int y){
Queue<Node> queue = new LinkedList<>();
queue.add(new Node(x,y));
while(!queue.isEmpty()){
Node node = queue.poll();
vis[x][y] = 1;
ans[0][0] = "";
for(int i = 0; i < 4; i++){
int x1 = node.x + dir[i][0];
int y1 = node.y + dir[i][1];
if(x1<=n&&x1>0&&y1<=m&&y1>0]){
if(vis[x1][y1]==0&&arr[x1][y1]=='0'){
vis[x1][y1] = 1;
len[x1][y1] = len[node.x][node.y]+1;
ans[x1][y1] = ans[node.x][node.y]+String.valueOf(i);
queue.add(new Node(x1,y1));
}
}
}
}
}
int r=100001;
int l=1;
int ans=0;
while(l <= r){
int mid=(l+r)/2;
if(true && >){
l=mid+1;
ans=mid;
}else{
r=mid-1;
}
}
//博弈问题简单模板,可根据题意进行更改
f(n, 0, 0)
public static char f(int num, int me, int you){
if(num < n[0]){ //不够取
if((me&1)==1&&(you&1)==0)return '+';
else((me&1)==0&&(you&1)==1)return '-';
else return '0';
}
boolean ping = flase //判断是否平局
for(int i = 0; i < 3; i++){
if(num >= n[i]){
char res = f(num - n[i], you, me + n[i]);
if(res == '-'){
return '+';
}
if(res == '0'){
ping = true;
}
}
//如果能走到这行,说明不存在对手输的情况,那么是否存在平的情况
if(ping)
return '0';
else
return '-';
}
}
本文希望可以给正在备考或者以后想要参赛的同学一些帮助。预祝各位都能取得理想的名次。