目录
一、P504 单词分析(模拟)(枚举)
1.单词分析 - 蓝桥云课https://www.lanqiao.cn/problems/504/learning/?problem_list_id=19&page=1
题目描述
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
(1)简单模拟:
# 输入
n=input()
#枚举
#字典记录字母出现的次数
count={}
#模拟
for letter in n:
if letter in count:
count[letter]+=1
else:
count[letter]=1
most_number=0
most_letter=''
for letter,count in count.items():
#字典序最小的字母
if count>most_number or(count==most_number and letter<most_letter):
most_number=count
most_letter=letter
print(most_letter)
print(most_number)
(2)利用ASCII值:
使用一个长度为26的数组来记录每个字母(a-z)在单词中出现的次数。数组的索引对应字母的ASCII码值减去字母'a'的ASCII码值
# 输入 n = input().strip() # 初始化一个长度为26的数组,用于统计每个字母的出现次数 count = [0] * 26 # 遍历单词中的每个字符,统计字母出现次数 for char in n: count[ord(char) - ord('a')] += 1 # 找到出现次数最多的字母 max_count = max(count) max_char = chr(count.index(max_count) + ord('a')) print(max_char) print(max_count)
统计数组中找到出现次数最多的字母,并将其转换为字符形式。如果有多个字母出现次数相同,
count.index(max_count)
会返回第一个最大值的索引,因此会输出字典序最小的字母。
(3)利用排序:
a = input() dicts = {} for i in a: dicts[i] = dicts.get(i, 0) + 1 # 按出现次数降序排序,如果次数相同则按字母升序排序 l = sorted(dicts.items(), key=lambda x: (-x[1], x[0])) print(l[0][0]) print(l[0][1])
二、P502 成绩统计(模拟)
2.成绩统计 - 蓝桥云课https://www.lanqiao.cn/problems/502/learning/?problem_list_id=19&page=1
题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
(1)简单模拟:
# 输入
n=int(input())
scores=[]
for _ in range(n):
scores.append(int(input()))
# 模拟
passable=0
excellent=0
for score in scores:
if score>=60:
passable+=1
if score>=85:
excellent+=1
pass_rate=(passable/n)*100
exce_rate=(excellent/n)*100
# 多种输出方法
#round 和字符串拼接
print(str(round(pass_rate)) + "%")
print(str(round(exce_rate)) + "%")
# # % 格式化
# print("%.0f%%" % pass_rate)
# print("%.0f%%" % exce_rate)
# #format
# print("{:.0f}%".format(pass_rate))
# print("{:.0f}%".format(exce_rate))
# #f-string
# print(f"{round(pass_rate)}%")
# print(f"{round(exce_rate)}%")
(2)其他算法 :
# 输入
n = int(input())
scores = [int(input()) for _ in range(n)]
# 定义函数:计算得分大于等于 x 的百分比
def f(x):
count = sum(1 for score in scores if score >= x) # 统计满足条件的学生人数
percentage = (count / n) * 100 # 计算百分比
return f"{round(percentage)}%" # 四舍五入并添加百分号
print(f(60))
print(f(85))
三、P592 门牌制作(枚举)(模拟)
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
num=0
# 模拟
for i in range(1,2020+1):
i_str=str(i)
num+=i_str.count("2")
print(num)
count = 0
for number in range(1, 2021):
number_str = str(number)
if "2" in number_str:
count += number_str.count('2')
print(count)
四、【困难】P505 数字三角形(动态规划)(DFS)
4.数字三角形 - 蓝桥云课https://www.lanqiao.cn/problems/505/learning/?problem_list_id=19&page=1
题目描述
一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
(1)DFS实现
# 输入处理
N = int(input())
triangle = [list(map(int, input().split())) for _ in range(N)]
# DFS 实现
max_sum = -1 # 记录最大路径和
stack = [(0, 0, 0, 0, 0)] # (i, j, left_count, right_count, current_sum)
while stack:
i, j, left_count, right_count, current_sum = stack.pop()
# 终止条件:到达最后一行
if i == N - 1:
# 检查左右步数差是否满足条件
if abs(left_count - right_count) <= 1:
max_sum = max(max_sum, current_sum + triangle[i][j])
continue
# 向左下走
stack.append((i + 1, j, left_count + 1, right_count, current_sum + triangle[i][j]))
# 向右下走
stack.append((i + 1, j + 1, left_count, right_count + 1, current_sum + triangle[i][j]))
# 输出结果
print(max_sum)
(2)动态规划
# 输入处理
N = int(input())
triangle = [list(map(int, input().split())) for _ in range(N)]
# 初始化动态规划数组
dp = [[0] * (i + 1) for i in range(N)]
dp[0][0] = triangle[0][0] # 第一行的值
# 动态规划填充
for i in range(1, N):
for j in range(i + 1):
if j == 0: # 最左边元素只能从右上方得到
dp[i][j] = dp[i - 1][j] + triangle[i][j]
elif j == i: # 最右边元素只能从左上方得到
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j]
else: # 其他元素从上方较大值得到
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]
# 根据行数的奇偶性返回结果
if N%2 == 1: # 奇数行,返回中间值
print(dp[-1][N // 2])
else: # 偶数行,返回中间两个值中的较大值
print(max(dp[-1][N // 2 - 1], dp[-1][N // 2]))
动态规划:通过限制路径终点间接保证左右步数差不超过 1