蓝桥杯还剩10天?我们如何准备

蓝桥杯最后十天了,我们该做什么?

不要着急,小编吐血整理了蓝桥杯高频考点以及赛前须知,朋友们,我们一起冲!

下面是蓝桥杯官网给出的考试大纲

大纲分为算法和数据结构两部分,由于我们有数据结构基础,所以我会重点从算法部分开始学习。

算法一 枚举

基本思想:根据问题的本身性质,一一列举出该问题所有可能的解,并在逐一列举的过程中,检验每个可能的解是否是问题的真正解。

有点看不懂?没关系,我们直接从例题出发—————

例一 

找出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 = ' ')

到这里,枚举算法就告一段落啦,此算法比较简单,大家可以接着往后学,或者搜一搜网上的蓝桥杯真题有没有用枚举法来做的,多做练习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值