蓝桥最后一月冲刺(2/17)手算题和杂题

有的同学问我:哥,我假期一点没学,现在还有没有救?

我说:有,我这里有最后一个月的免费冲刺班,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个小时就可以学会。真的不难,也确实对于解决特定问题有奇效。

  • 31
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值