蓝桥杯备赛[day02]3月16日|python|复习回顾|背诵枚举模版

目录

复习回顾

 1 成绩统计 

2 排列字母​

3 纸张尺寸

1 枚举题

1.1 枚举的思想

1.2 枚举解题的要素

1.3 枚举的步骤

1.3.1 例题

2 枚举技术

2.1 组合型枚举

2.2 排列型枚举

3 二进制法


复习回顾

 1 成绩统计 

用cnt1表示及格的人数,cnt2表示优秀的人数,答案即为cnt1/n、cnt2/n四舍五入后乘100!

不要忘记输出百分号!

import os
import sys

# 请在此输入您的代码
n = int(input())

cnt1 = 0
cnt2 = 0

for i in range(1,n+1):
    x = int(input())
    if x >= 60:
        cnt1 += 1
    if x >= 85:
        cnt2 += 1
print("{:.0f}%".format(round(100.0 * cnt1 / n,2)))
print("{:.0f}%".format(round(100.0 * cnt2 / n,2)))

5

0

100

60

85

70

80%

40%

2 排列字母

直接对字符串进行排序即可,使用标准排序函数。

Python先转换成 list 再进行排序,最后拼接成字符串(因为 Python 中无法修改字符串元素)。

import os
import sys

# 请在此输入您的代码
s = 'WHERETHEREISAWILLTHEREISAWAY'
s = list(s)
s.sort()
print("".join(s))

out=AAAEEEEEEHHHIIILLRRRSSTTWWWY

⚠️join函数前面是 .  

3 纸张尺寸

根据题意维护长边长度a和短边长度b。

对于输入A0而言,a=1189, b=841。 根据输入的A后面的数字x,循环x次:  

        每次让长边a除以2(向下取整),短边b不变。    

        然后再根据a,b的大小关系进行调整,如果a<b则交换a,b。 

        短边变成长边,长边的一半变为短边。


1 枚举题

题目需要处理大量同类情况

暴力枚举所有情况 (枚举是暴力的一种)

利用计算机强大的算力

注意:不要遗漏任何情况

注意:如果枚举量太大,需要剪枝

1.1 枚举的思想

将问题的所有可能成为答案的解一一列举,然后根据问题所给出的条件判断此解是否合适,如果合适就保留,反之则舍弃。

1.2 枚举解题的要素

确定枚举解的范围,以及判断条件

选取合适枚举方法,进行逐一枚举,此时应注意能否覆盖所有的可能的解

在枚举时使用判断条件检验,留下所有符合要求的解。

1.3 枚举的步骤

1.根据题目确定枚举的范围,并选取合适的枚举方式,不能遗漏任何一个真正解,同时避免重复。

2.为了提高解决问题的效率,看题目是否存在优化,将可能成为解的答案范围尽可能缩小。

3.根据问题找到合理、准确描述、易编码的验证条件。

4.枚举并判断是否符合第3步确定的的条件,并保存符合条件的解。

5.按要求输出枚举过程中留下的符合条件的解。

1.3.1 例题

蓝桥杯题库613

一个整数如果只含有因子3、5、7,称为幸运数字。 前10个幸运数字是3、5、7、9、15、21、25、27、35、45。 问59084709587505 是第几个幸运数字。

【题目描述】一个整数如果只含有因子3、5、7,称为幸运数字。问59084709587505是第几个幸运数字。

【解题思路】暴力枚举。这个系列的数可以表示为3^i × 5^j × 7^k,枚举所有不超过范围的i、j、k组合。代码中最小的3^50肯定超过59084709587505。

import numpy as np

cnt=0
for i in range(50):
  for j in range(50):
    for k in range(50):
      a = 3**i
      b = 5**j
      c = 7**k
      if a*b*c <=59084709587505:
        cnt += 1
print(cnt-1)
#out=1906-1=1905; 1不是幸运数字!

2 枚举技术

 把所有情况排列、组合出来,逐个处理。

2.1 组合型枚举

确认n和m的数量后,我们可以直接套模版,输出结果。

import numpy as np
chosen = []
n = 0
m = 0

def calc(x):
    if len(chosen) > m:
        return
    if len(chosen) + n - x + 1 < m:
        return
    if x == n + 1:
        for i in chosen:
            print(i,end=' ')
        print(' ')
        return
    calc(x + 1)

    chosen.pop()
if __name__ == '__main__':
    tem = input().split()
    n = int(tem[0])
    m = int(tem[1])
    calc(1)
   

2.2 排列型枚举

A_{n}^{n} 全排列

order = [0] * 20
chosen = [0] * 20
n = 0
def calc(x):
    if x == n + 1:
        ansTem = ''
        for i in range(1, n + 1):
            print(order[i],end=' ')
            print('')
            return
        for i in range(1,n+1):
            if(chosen[i]==1):
                continue
            order[x]=i
            chosen[i]=1
            calc(x+1)
            chosen[i]=0
            order[x]=0
if __name__ == '__main__':
    n = int(input())
    calc(1)

Python排列函数permutations():

功能:连续返回由 iterable序列中的元素生成的长度为r的排列。

如果r未指定或为None,r默认设置为 iterable 的长度,即生成包含所有元素的全排列。

from itertools import*
s = ['a','b','c']
for element in permutations(s,2):
    a = element[0] + element[1]

#或者这样写:
a = ".join(element)
print(a)

3 二进制法

(2023年 4月6日 22:55首次发布)

猜你喜欢

转载自blog.csdn.net/m0_57656758/article/details/129999380