十四届蓝桥杯Python经典例题

又来啦
继续蓝桥杯备赛

1、ASC

已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?

import os
import sys
print('76')

白给题,相比用程序实现,不如直接数

2、数字三角形

十四届蓝桥杯Python经典例题_第1张图片
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入描述
输入的第一行包含一个整数N (1≤N≤100),表示三角形的行数。
下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

输出描述
输出一个整数,表示答案。

n=int(input())
list_1=[list(map(int,input().split())) for i in range(n)]
for i in range(1,n):
    for j in range(0,i+1):
        if j==0:
            list_1[i][j]=list_1[i][j]+list_1[i-1][j]
        elif j==i:
            list_1[i][j] = list_1[i][j] + list_1[i - 1][j-1]
        else:
            list_1[i][j] = list_1[i][j] + max(list_1[i-1][j],list_1[i-1][j-1])
if ((n%2)==1):
    print(list_1[i][j//2])
if((n%2)==0):
    print(max(list_1[i][n//2-1],list_1[i][n//2]))

这题是个动态规划,首先接收三角形,用了map函数,自动转成第一个参数类型,然后【】转成列表,之后进行逐行赋值,注意数组下标是从0开始的,而数组存下来是一个立起来的三角形。而最左边的一列只有它楼上的值能加,最右边就是左上方的值啦,中间就是普遍的两个肩膀选最大(楼上和左上),输出时也注意行的奇偶性。
至于赋值特性嘛,因为都取大的值,所以越往中间值就越大,最后一行最中间就是最大的啦!

3、矩形切割(结果填空题)

**【问题描述】**小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?

import os
import sys
a=2019
b=324
sum=0
while a!=b:
    a-=b
    if a<b:
        a,b=b,a
    sum+=1
print(sum+1)

这题仔细想想,每次切一个正方形,说白了不就长边减短边嘛,最后剩下一个正方形,加到前面的总和上

4、特别数的和(编程大题)

**【问题描述】**小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?

n = int(input())
ans = 0
for i in range(1,n+1):
    t = i
    ok = False
    while t!=0:
        g = t % 10
        if g==2 or g==0 or g==1 or g==9:
            ok = True
        t = t // 10
    if ok:
        ans += i
print(ans)

这题要把所有符合条件的数加在一起,地毯式搜索,暴力破解!

5、最短路

十四届蓝桥杯Python经典例题_第2张图片

import sys
import os

fig = [
    ["A", "E", 1],
    ["A", "B", 2],
    ["A", "C", 1],
    ["A", "D", 1],
    ["A", "E", 1],
    ["B", "G", 1],
    ["B", "J", 2],
    ["C", "D", 3],
    ["C", "G", 3],
    ["C", "F", 3],
    ["D", "G", 2],
    ["D", "H", 1],
    ["D", "I", 2],
    ["E", "H", 1],
    ["E", "I", 3],
    ["F", "J", 1],
    ["F", "G", 1],
    ["G", "K", 2],
    ["G", "I", 3],
    ["H", "L", 2],
    ["H", "I", 1],
    ["I", "M", 3],
    ["J", "S", 2],
    ["K", "N", 1],
    ["K", "L", 3],
    ["L", "R", 1],
    ["L", "M", 1],
    ["M", "N", 2],
    ["M", "Q", 1],
    ["M", "S", 1],
    ["N", "P", 1],
    ["Q", "O", 1],
    ["O", "R", 3],
    ["P", "O", 1],
    ["R", "S", 1],
]

nums=[]
def get(num,element):
  for x,y in enumerate(fig):
    if element[1]==y[0]:
      num+=y[2]
      if y[1]=='S':
        nums.append(num)
      else:
        get(num=num,element=y)

for i,j in enumerate(fig):
  if j[0]=='A':
    get(num=j[2],element=j)
  
print(min(nums))

这题如名,是最短路问题,当然眼力好的同学几十秒也能出结果,但想用计算机算就要先把图输进去,结构就是二维数组,起点、终点、距离,依次写清楚,nums用来存储A到S的多种距离,最后用min函数输出。
for循环中if用来确定起点分支,通过get递归函数,一条分支一条分支的去找路,然后把距离加上,继续找,直到找到S。

6、成绩分析

题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

请计算这次考试的最高分、最低分和平均分。

输入描述
输入的第一行包含一个整数n (1≤n≤104),表示考试人数。

接下来n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述
输出三行。

第一行包含一个整数,表示最高分。

第二行包含一个整数,表示最低分。

第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

n=int(input())
list_1=[]
for i in range(n):
    a=int(input())
    list_1.append(a)
print(max(list_1))
print(min(list_1))
print('{:.2f}'.format(sum(list_1)/n))

这题学会print字符串和‘/’

7、排序

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。

在冒泡排序中,每次只能交换相邻的两个元素。

小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。

例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串qiao 排序,总共需要 4 次交换。

小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交 换,可是他忘了吧这个字符串记下来,现在找不到了。

请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。

word='abcdefghijklmnopqrstuvwxyz'
max_l=len(word)
def get(max_n):
    for l in range(2,max_l+1):
        test_word=word[:l]
        n=0
        for x,y in enumerate(test_word):
            for a in range(0,x):
                #print(test_word)
                n+=1
            if n>max_n:
                return l,n
current_l,current_n=get(100)
# print(current_n)
current_word=sorted(word[:current_l],reverse=True)
for a ,b in enumerate(current_word):
    if current_n==100:
        current_word.remove(b)
        current_word.insert(0,b)
        W=""
        for w in current_word:
            W+=w
        print(W)
        break
    current_n=current_n-1

如果学过数据结构应该知道冒泡排序的算法复杂度n*(n-1)/2,n=15时,交换次数=105,最接近100,也就是15个字符移动最多的情况,倒序少五个,就把15个倒过来,倒数第6个,向前移5个。

你可能感兴趣的:(蓝桥杯Python,蓝桥杯,python,职场和发展)