蓝桥杯最后十天了,我们该做什么?
不要着急,小编吐血整理了蓝桥杯高频考点以及赛前须知,朋友们,我们一起冲!
下面是蓝桥杯官网给出的考试大纲
大纲分为算法和数据结构两部分,由于我们有数据结构基础,所以我会重点从算法部分开始学习。
算法一 枚举
基本思想:根据问题的本身性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能的解是否是问题的真正解。
有点看不懂?没关系,我们直接从例题出发—————
例一
找出1到100之间的素数,要求对1到100之间的所有整数进行判断。
根据枚举的流程图,是不是类似于我们之前python基础篇中带条件的for循环?
枚举算法程序实现的三要素为“枚举解(循环语句)”、“筛选解(条件判断)”、”输出解(或统计解的个数)“。其一般程序结构特点是循环包含分支结构语句,实现对枚举出的解进行判断与筛选。其中:循环包含分支结构语句:用于确定枚举对象、枚举范围和判定条件。
现在有没有对枚举算法有一个更深的理解了呢?那么,接下来,我们试着解题:
import math
def pd(x):
if x <= 1:
return False
y = int(math.sqrt(x))
for i in range(2, y+1):
if x%i == 0:
return False
return True
for i in range(1, 101):
if pd(i):
print(i, end = ' ')
枚举算法是通过牺牲时间来换取答案的全面性,属于搜索策略,适用于那些解变量连续、值域确定的问题。
枚举算法的优化主要有:减少枚举变量、缩小枚举变量的值域,减少重复计算等。
练习题:关于枚举的题目和文章 - C语言网 (dotcpp.com)
以下附各题代码,如果有编不出来的题目,代码可供参考。
优秀的拆分
题目描述
一般来说,一个正整数可以拆分成若干个正整数的和。例如,1 = 1,10 = 1 + 2 + 3 + 4 等。
对于正整数 n 的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆 分下,n 被分解为了若干个不同的 2 的正整数次幂。注意,一个数 x 能被表 示成 2 的正整数次幂,当且仅当 x 能通过正整数个 2 相乘在一起得到。
例如,10 = 8 + 2 = 23 + 21 是一个优秀的拆分。但是,7 = 4 + 2 + 1 = 22 + 21 + 20 就不是一个优秀的拆分,因为 1 不是 2 的正整数次幂。
现在,给定正整数 n,你需要判断这个数的所有拆分中,是否存在优秀的 拆分。若存在,请你给出具体的拆分方案。
输入格式
输入只有一行,一个正整数 n,代表需要判断的数。
输出格式
如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出 这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定 了拆分数字的顺序后,该拆分方案是唯一的。 若不存在优秀的拆分,输出“-1”(不包含双引号)。
样例输入
6
样例输出
4 2
实现代码
n = int(input())
i = 1
a = []
b = []
while 2 ** i <= n:
a.append(2**i)
i += 1
a.sort(reverse = True)
if n % 2 != 0:
print(-1)
else:
for i in a:
if n - i >= 0:
n -= i
b.append(i)
if n == 0:
for j in b:
print(j, end = ' ')
if n != 0:
print(-1)
百钱百鸡问题
题目描述
中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
输入格式
无输入
输出格式
给出所有的解,每组解占一行
解的顺序:按“字典序”排列,即公鸡数少的在前;公鸡数相同,母鸡数少的在前
格式:
cock=%d,hen=%d,chicken=%d\n
样例输入
无
样例输出
cock=0,hen=25,chicken=75 cock=4,hen=18,chicken=78 cock=8,hen=11,chicken=81 cock=12,hen=4,chicken=84
实现代码
for k in range(20):
for m in range(34):
for s in range(100):
if k+m+s==100 and k*5+m*3+s/3==100:
print("cock={},hen={},chicken={}".format(k,m,s))
哥德巴赫曾猜测
题目描述
德国数学家哥德巴赫曾猜测:任何大于6的偶数都可以分解成两个素数(素数对)的和。但有些偶数可以分解成多种素数对的和,如: 10=3+7,10=5+5,即10可以分解成两种不同的素数对
输入格式
输入任意的>6的正偶数(<32767)
输出格式
试求给出的偶数可以分解成多少种不同的素数对(注: A+B与B+A认为是相同素数对)
样例输入
1234
样例输出
25
实现代码
import math
def pd(x):
if x <= 1:
return False
y = int(math.sqrt(x))
for i in range(2, y+1):
if x % i == 0:
return False
return True
while True:
n = int(input())
count = 0
for i in range(2, int(n / 2)+1):
if pd(i) and pd(n - i):
count += 1
print(count)
送分题素数
题目描述
输出100->200之间的素数的个数,以及所有的素数。
输入格式
无
输出格式
100->200之间的素数的个数,以及所有的素数。
样例输入
无
样例输出
21 101 103 ... 197 199
实现代码
def pd(x):
if x <= 1:
return False
for i in range(2, int(x/2) + 1):
if x % i == 0:
return False
return True
a = []
count = 0
for i in range(100, 201):
if pd(i):
count += 1
a.append(i)
print(count)
for i in a:
print(i, end = ' ')
到这里,枚举算法就告一段落啦,此算法比较简单,大家可以接着往后学,或者搜一搜网上的蓝桥杯真题有没有用枚举法来做的,多做练习。