有的同学问我:哥,我假期一点没学,现在还有没有救?
我说:有,我这里有最后一个月的免费冲刺班,17节集锦,让你轻松实现最后一个月弯道超车!
我会根据讲解去年蓝桥杯的真题和我之前练习的经典题目,以此来拓展知识点,为大家讲解算法知识,实现小白也能听懂拿分。(本课程针对冲省赛的选手)
b站视频链接:第二节课(手算题和杂题)_哔哩哔哩_bilibili
第一部分 (上节课的作业与复习)
首先,我们来看一下上节课的作业762. 字符串匹配 - AcWing题库
老规矩,第一步:先看题意,题目中让输入一个小数和两个字符串,要求比较 重复的部分与长度的比值 和 输入的值 的大小,如果大于等于,输出yes,否则输出no。之后看看如何用人脑的方式做出来,显然,最先想到的方法肯定是从前向后看,两个字符串一个接一个字符对比,最后把统计出的数字进行计算。
第二步:将思路或策略转化成编程语言,输入的小数拿float或double存成k,字符串用char[]或string来存成a, b,此外,方便比较,统计重复字符次数的数cnt需要变成浮点数,可以使用强转,也可以一开始就设置成浮点数,最后比较 比值和k 的大小 ,输出结果。代码如下图:
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
float k, c; //定义浮点数k和之后需要比较的c
int cnt = 0; //设置用于统计相同字符的cnt
string a, b; //设置字符串
cin >> k >> a >> b; //输入
int len = a.length(); //将字符串的长度赋值给len
for(int i = 0; i < len; i ++ ){ //开始循环,一个一个找
if(a[i] == b[i]) cnt ++; //如果相同位置的字符相同,cnt + 1
}
c = (float)cnt / len; //将比值赋值给c
if(c >= k) cout << "yes"; //比较c和k 输出结果
else cout << "no";
return 0;
}
第三步数据结构与算法优化,跳过
第四步debug,没问题,跳过。
看看你做对了吗,用了多长时间?
第二部分 (手算题和杂题)
这一种题型主要集中在填空题。学长建议大家如果要取得一个不错的成绩,必须要拿下填空题,因为这类题是蓝桥杯中最好得分的题。
一、手算题
学过上一节课的同学都知道,做算法题分为四个步骤,其实今天讲的手算题和杂题按照步骤来分就是第一步的,不考虑其他步骤的题。
填空题中有一部分是通过手算就可以得出结论的,因为是填空题,所以不需要代码,手算就可以。我们的目的是得分,不管黑猫白猫,抓到老鼠就是好猫
这个手算的过程可能会有些无聊和繁琐,需要花费大半个小时的时间,但是这是最容易得分的题。如果我们难题不会做,简单题又懒得做,那我们拿什么得分呢,是吧,大家这种题不要嫌麻烦,也不推荐写代码,因为很多同学代码积累量没那么多,写代码的时间早就手算两遍了。
下面举一个例子:迷宫
像这道题,如果要做的话也不是很难,使用深度优先搜索DFS就可以做,但是完全没必要,我们用手来算,一点一点来找,10分钟之内肯定就可以搞定。对于大多数同学来说,10分钟代码是写不完的(当然,如果你可以,当我没说,算你狠)。
这类笔算题我没有什么要讲的了,重点有两个:1.读好题目要求,理解好题干中的意思 2.要有细心和耐心,中间不要犯错,多做两遍。
二、杂题
这类题目主要有两种方法去做1.用excel去做 2.用python去做
用excel来做的大概有两种,一个是日期类的问题,这类问题可以用excel中对于日期的处理很轻松做出来,另一类是对于一堆数要进行处理,可以用excel做批量的操作,这两种类型对于excel的要求并不高,大家跟着我学完这节课也就会了。
1. 日期类 星期一 链接已经放上了,这是一道第九届蓝桥杯的题目
其实这道题有几种解决方法,我们一一看一下
首先,当然我们可以写代码,不过不推荐,不值得,其次,如果数日期的话,也不推荐,太麻烦。推荐用excel来做
可知,共有5217周,且最后一周不包括星期一,所以共有5217个星期一。
第二种方法是用python来做,可以使用datetime函数来做具体操作很简单,只有3个,
1. 用datetime()将年月日读入成datetime格式 eg:dt1 = datetime(1901,1,1) 将1901年1月1日读入到datetime格式中的dt1中
2. 用weekday()来读出当天是星期几, eg: dt1.weekday()
3. 用直接相减,和 days的方法 来求出两个时间的差的天数 eg:x = dt2 - dt1 x.days()
python不难的大家看懂方法,把代码敲一遍就会了。
from datetime import * #引入datetime库
dt1 = datetime(1901,1,1) #将1901,1,1存入datetime中
print(dt1) #打印dt1
dt2 = datetime(2000,12,31) #将2000,12,31存入datetime中
print(dt1.weekday()) #打印dt1是周几
x = dt2 - dt1 #将dt2 - dt1 的时间差存入x
y = x.days // 7 #看时间差有几周
z = x.days % 7 #余的天数存入z
print(y)
print(z)
print(dt1.day)
另外,由于这道题简单,我们可以直接查电脑上的日历,也是可以的
其次,python做一些关于大数的问题有天然的优势
比如下面这个题目 乘积尾零 这是第九届省赛的题目
第一步,看题目,很明显,就是求这些数的乘积的后面有多少零,对于填空题,还是与大数有关的,我们首选python (这里的大数通常指10的18-19次方以上的数),因为这些大数单纯用longlong类型都会爆,在c++/java中 int 最大 大约是10的9次方,longlong是10的19次方,如果超过,就不要用这些类型,会出错(小知识点)但是python就不会,所以用pyhon就有天然的优势。
那么就很简单了,做一个循环,把所有数都乘在一起,然后对尾部进行判断有多少尾零。
第二步,翻译成计算机语言,如下面代码,我们将这些数存入x中,在循环里将他们连乘,之后通过while来判断尾部有多少0。
这道题有一个对于新手的做题小技巧:如果想要取出一个数中每一位中的数,可以使用如下模板:
int a = 4567891;
while(a > 0){
cout << a % 10 << " ";
a /= 10;
}
模板中定义了一个a,想要读取a的每一位的数字,就可以使用下面的循环来做,有很多小题中都会用到这个小方法。
这道题也用其他语言来做也是比较好做的,由于尾0只可能是由5和2相乘来形成,所以我们可以判断数据中的数由多少2和5相乘,取2和5中较小的那一个就是0的个数,这种方法有一定的数学思维,大家可以自行理解一下,这里不过多讲解了。
最后一部分还有一些函数方法要大家了解并掌握,对做题很有帮助 这节课要学的是pow()函数和log()函数。
pow()函数是用来求一个数的指数, c++/python中需要引入math的库函数,形式为pow(底数,指数) eg: 求5的2次方 pow(5,2) 求3的-2次方pow(3,-2) ,java中形式为Math.pow(5,2)
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
cout << pow(5,2);
return 0;
}
package shiyan1;
public class javaa {
public static void main(String[] args) {
System.out.println(Math.pow(5,2));
}
}
log()函数是用来求一个数的对数,c++/python需要引入math库,c++形式为log(真数),其中log(a)的意思就是以e为底a的对数,log2(a)就是以2为底a的对数,log10(a)同理,其他的对数要进行换底公式的换底,比如求以3为底5的对数。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
cout << log(5)/log(3);
return 0;
}
python形式为math.log(真数,底数),如果是自然对数,即以e为底a的对数,形式为math.log(a),其他的对数运算是比如以b为底a的对数,形式为math.log(a,b),比如以3为底,5的对数math.log(5,3)
import math
print(math.log(5.3))
java中Math.log(a)即以e为底a的对数,Math.log10(a)即以10为底a的对数,其他普通的对数也要用换底公式来做,如以3为底5的对数
package shiyan1;
public class javaa {
public static void main(String[] args) {
System.out.println(Math.log(5)/Math.log(3));
}
}
第一道题建议用简单的数学知识结合excel和python来做,用c++和java来做也没问题,但主要就是锻炼一下excel和python的能力。第二道题是用基本的运算知识和log函数来做的,比第一道题难一些,但了解明白题意,做出来也不是很难。
希望大家可以自学一下python和excel的基础知识(看我的视频也可以),以学java或者c/c++的基础,大约1-2个小时就可以学会。真的不难,也确实对于解决特定问题有奇效。