蓝桥杯学刷题记录
2022.15.8
第一题-单词分析
题目:
题目描述:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
输入描述:输入一行包含一个单词,单词只由小写英文字母组成。对于所有的评测用例,输入的单词长度不超过 1000。
输出描述:输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数
答案
import os
import sys
# 请在此输入您的代码
word=input()
a=0
b=[]
for i in word:
c=word.count(i)
if c>=a:
a=c
for j in word:
if word.count(j)==a:
b.append(j)
b.sort()
print(b[0])
print(a)
第二题-成绩统计
题目:
题目描述:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
输入描述:输入的第一行包含一个整数 n (1≤n≤10 4),表示考试人数。接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述:输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数
答案
import os
import sys
n=int(input())
jigshu=0
youxs=0
for i in range(n):
a=int(input())
if 0<=a<=100:
if 60<=a:
jigshu+=1
if 85<=a:
youxs+=1
print('{:.0%}'.format(jigshu/n))
print('{:.0%}'.format(youxs/n))
第三题-最短路
题目:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如下图所示,GG 是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。
则从 AA 到 SS 的最短距离是多少?
答案
import os
import sys
# 请在此输入您的代码
# 录入路线图
r_list = [
["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, r):
for x, y in enumerate(r_list):
# 上一个点与当前点一致
if y[0] == r[1]:
# 累计长度
num += y[2]
# 直到S才结束
if y[1] == "S":
nums.append(num)
# 否则继续
else:
get(num=num, r=y)
for q, w in enumerate(r_list):
n = 0
# 从A开始
if w[0] == "A":
get(num=w[2], r=w)
# 取最小值
print(min(nums))
学习总结
count()函数
描述:统计在字符串/列表/元组中某个字符出现的次数,可以设置起始位置或结束位置。
用法:str.count(“字符串/列表/元组”, start,end)或str.count(“字符串/列表/元组”)
说明:Str-要统计的字符(可以是单字符,也可以是多字符)
Star-索引字符串/列表/元组中某个字符的起始位置,默认参数为0
End-索引字符串/列表/元组中某个字符的结束位置,默认参数为字符串长度即len(str)
返回值:int整型
扩展:find()
检测字符串中是否包含子字符串,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置否则返回-1。
语法:字符串序列.find(子串,开始位置的下标,结束位置的下标)
index()
检测字符串中是否包含子字符串,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置,否则则报出异常。
语法:字符串序列.index(子串,开始位置的下标,结束位置的下标)
find()
返回字符串最后一次出现的位置,如果没有匹配项则返回-1
语法:字符串序列.rfind(子串,开始位置的下标,结束位置的下标)
'.0f ’
.0f” 表示浮点数保留0位小数输出,0可以该为其他数字。此方法只能在python3中使用
‘%.0f’也表示输出0位小数,可以同时在python2中与python3中使用
#举例
print('%.0f' %a)
print({:.0f}.format(a))
enumerate()
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法:enumerate(sequence, [start=0])
说明:sequence – 一个序列、迭代器或其他支持迭代对象。
start – 下标起始位置的值
返回 enumerate(枚举) 对象。
#举例
i = 0
seq = ['one', 'two', 'three']
for i,element in seq:
print i, seq[i]
'''输出
0 one
1 two
2 three
#i可以不用
'''
2022.12.9
第四题-回文日期
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述:输入包含一个八位整数 NN,表示日期。对于所有评测用例10000101≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。
输出描述:输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
####答案(通过率只有百分之40)
import os
import sys
# 请在此输入您的代码
day = int(input())
for i in range(day+1,99999999):
i = str(i)
if int(i[4:6])<=12 and int(i[6:])<=30:
if str(i) == str(i)[::-1]:
print(i)
break
for i in range(day+1,99999999):
i = str(i)
if int(i[4:6])<=12 and int(i[6:])<=30:
if i[0] == i[2] == i[5] ==i[7] and i[1] == i[3] == i[4] == i[6]:
print(i)
break
总结
python算数运算符
运算符 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
** | 幂(x**y,x的y次幂) |
// | 取整除 |
拓展
关系运算符
关系运算符 | 名称 |
---|---|
== | 等于 |
!= | 不等于 |
>(>=) | 大于(大于等于) |
<(<=) | 小于(小于等于) |
逻辑运算符 | 功能 |
---|---|
and | 两个语句都为真则返回真 |
or | 两个语句有一个为真则返回真 |
not | 真则返回假,假则返回真 |
位运算符 | 名称 | 功能 |
---|---|---|
& | 按位与 | 有0为0无0为1 |
l | 按位或 | 有1为1无1为0 |
^ | 按位异或 | 相同为1不同为0 |
~ | 按位取反 | 1变0,0变1 |
>> | 右移 | >>n:整体右移n位 |
<< | 左移 | <<n:整体左移n位 |
身份运算符 | 功能 |
---|---|
is | 两个变量位同一个变量返回真 |
is not | 两个变量不为同一个变量返回真 |
str()
功能:str( )函数能将int类型、float类型的数据转换成字符串类型。
扩展
字符串索引
举例 | 意义 |
---|---|
str[0] | 获取第一个元素 |
str[-2] | 获取倒数第二个元素 |
str[1:3] | 获取从偏移为1的字符一直到偏移为3的字符串,不包括偏移为3的字符串 |
str[1:] | 获取从偏移为1的字符一直到字符串的最后一个字符(包括最后一个字符) |
str[:3] | 获取从偏移为0的字符一直到偏移为3的字符串,不包括偏移为3的字符串 |
str[:-1] | 获取从偏移为0的字符一直到最后一个字符(不包括最后一个字符串) |
str[:] | 获取字符串从开始到结尾的所有元素 |
str[-3:-1] | 获取偏移为 -3 到偏移为 -1 的字符,不包括偏移为 -1 的字符 |
备注 | 字符串索引时可设置第三个参数为步长[::2] |
2022.12.12
第五题-门牌制作
题目
蓝要为一条街的住户制作门牌号。这条街一共有 2020位住户,门牌号从 1 到 2020 编号。小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
答案
import os
import sys
# 请在此输入您的代码
sum = 0
for i in range (2021):
flag = 0
one = i//1000
two = (i-one*1000)//100
three = (i-one*1000-two*100)//10
four = i%10
if one == 2:
flag+=1
if two == 2:
flag+=1
if three == 2:
flag+=1
if four == 2:
flag+=1
sum+=flag
print(sum)
第六题-卡片
题目
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?
答案
import os
import sys
# 请在此输入您的代码
count = 0
i = 1
while(1):
count+=str(i).count("1")
i+=1
if count==2021:
break
print(i-1)
第七题-购物单
题目
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
请输出小明要从取款机上提取的金额,单位是元。
商品 | 原价 | 折扣 |
---|---|---|
**** | 180.90 | 88折 |
**** | 10.25 | 65折 |
**** | 56.14 | 9折 |
**** | 104.65 | 9折 |
**** | 100.30 | 88折 |
**** | 297.15 | 半价 |
**** | 26.75 | 65折 |
**** | 130.62 | 半价 |
**** | 240.28 | 58折 |
**** | 270.62 | 8折 |
**** | 115.87 | 88折 |
**** | 247.34 | 95折 |
**** | 73.21 | 9折 |
**** | 101.00 | 半价 |
**** | 79.54 | 半价 |
**** | 278.44 | |
**** | 199.26 | 半价 |
**** | 12.97 | 9折 |
**** | 166.30 | 78折 |
**** | 125.50 | 58折 |
**** | 84.98 | 9折 |
**** | 113.35 | 68折 |
**** | 166.57 | 半价 |
**** | 42.56 | 9折 |
**** | 81.90 | 95折 |
**** | 131.78 | 8折 |
**** | 255.89 | 78折 |
**** | 109.17 | 9折 |
**** | 146.69 | 68折 |
**** | 139.33 | 65折 |
**** | 141.16 | 78折 |
**** | 154.74 | 8折 |
**** | 59.42 | 8折 |
**** | 85.44 | 68折 |
**** | 293.70 | 88折 |
**** | 261.79 | 65折 |
**** | 11.30 | 88折 |
**** | 268.27 | 58折 |
**** | 128.29 | 88折 |
**** | 251.03 | 8折 |
**** | 208.39 | 75折 |
**** | 128.88 | 75折 |
**** | 62.06 | 9折 |
**** | 225.87 | 75折 |
**** | 12.89 | 75折 |
**** | 34.28 | 75折 |
**** | 62.16 | 58折 |
**** | 129.12 | 半价 |
**** | 218.37 | 半价 |
**** | 289.69 | 8折 |
import os
import sys
# 请在此输入您的代码
value =[180.90,10.25,56.14,104.65,100.30,297.15,26.75,130.62,240.28,270.62,115.87,247.34,73.21,101.00,79.54,278.44,199.26,12.97,166.30,125.50,84.98,113.35,166.57,42.56,81.90,131.78,255.89,109.17,146.69,139.33,141.16,154.74,59.42,85.44,293.70,261.79,11.30,268.27,128.29,251.03,208.39,128.88,62.06,225.87,12.89,34.28,62.16,129.12,218.37,289.69]
discount=[0.88,0.65,0.9,0.9,0.88,0.5,0.65,0.5,0.58,0.8,0.88,0.95,0.9,0.5,0.5,0.7,0.5,0.9,0.78,0.58,0.9,0.68,0.5,0.9,0.95,0.8,0.78,0.9,0.68,0.65,0.78,0.8,0.8,0.68,0.88,0.65,0.88,0.58,0.88,0.8,0.75,0.75,0.9,0.75,0.75,0.75,0.58,0.5,0.5,0.8]
sum = 0
for i in range(len(value)):
sum+=(value[i]*discount[i])
sum = int(sum)
sum = (sum//100+1)*100
print(sum)
#这个题直接计算更简单,构建列表真的很麻烦
总结
count()
#第五题
import os
import sys
# 请在此输入您的代码
b=0
for i in range (1,2021):
a=str(i).count('2')
b+=a
print(b)
语法格式 : str.count(sub[, start[, end]])
作用:用于检索指定字符串在另一个字符串中出现的次数,如果检索的字符串不存在则返回0,否则返回出现的次数。
参数说明 str:表示原字符串 sub:表示要检索的子字符串 start:可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索 end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾
2022.12.15
第八题-跑步锻炼
题目
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
答案
import datetime
start = datetime.date(2000, 1, 1)
end = datetime.date(2020, 10, 1)
days = datetime.timedelta(days=1)
ans = 0
while end >= start:
if start.day == 1 or start.weekday() == 0:
ans += 2
else:
ans += 1
start += days
print(ans)
第九题- 既约分数
题目
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?
答案
import os
import sys
import math
# 请在此输入您的代码
c = 0
for i in range(1,2021):
for j in range(1,2021):
if math.gcd(i,j) == 1:
c+=1
print(c)
总结
datetime
https://blog.csdn.net/weixin_52132159/article/details/119305524?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167106998916800182760828%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167106998916800182760828&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-119305524-null-null.142v68control,201v4add_ask,213v2t3_control1&utm_term=datetime&spm=1018.2226.3001.4187
math.gcd()
math.gcd(m,n)返回m和n的最大公约数