目录
成绩统计
思路
代码
单词分析
思路
代码
回文日期
思路
代码
最短路
思路
代码
货物摆放
思路
代码
成绩统计
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
思路
遍历输入全体即可,值得注意的是这道题中用到round(),意为取整函数,以及最后要用f'{}'连接字符串和数字
代码
n=int(input())
a=[]
for i in range(n):
b=int(input())
a.append(b)
ans1,ans2=0,0
for i in range(n):
if 60<=a[i]:
ans1+=1
if 85<=a[i]:
ans2+=1
x=round(ans1/n*100)
y=round(ans2/n*100)
print(f'{x}%')
print(f'{y}%')
单词分析
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
输入描述
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
输出描述
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
思路
遍历输入字符串,计算出每个字母的数量,记录最大出现次数和该字母
代码
s=input()
ls="abcdefghijklmnopqrstuvwxyz"
max1=0
ans=""
for j in ls:
cnt=0
for i in range(len(s)):
if j==s[i]:
cnt+=1
if cnt>max1:
max1=cnt
ans=j
print(ans)
print(max1)
回文日期
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例,1≤N≤89991231,保证 NN 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
思路
将字符传转化成日期格式,让日期自增,再将日期格式转化成字符串,判断是否满足要求
代码
import datetime
data=input()
y=int(data[:4])
m=int(data[4:6])
d=int(data[6:8])
day1=datetime.date(y,m,d)
flag=1
for n in range(9999):
day1=day1+datetime.timedelta(days=1)
s=str(day1).replace("-","")
if s==s[::-1]:
if flag:
print(s)
flag=0
if s[1]==s[3]==s[4]==s[6]:
print(s)
break
最短路
如下图所示,G是一个无向图,其中蓝色边的长度是 1、橘色边的长度是 2、绿色边的长度是 3。则从 A 到 S 的最短距离是多少?
思路
这道题可以直接从图中看出来,最小值是6,但我们为了学习一下深度优先搜索,这里认真做一下。 深搜的思路是从A开始出发,向他的邻接点深度搜索,每次深入增加num,即此路径的边长之和。如果找到了S,停止递归,将num存储在列表中。最终输出该列表的最小值,就是我们要的最小路径。
代码
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 dfs(num,r):
for y in r_list:
if y[0]==r[1]:
num+=y[2]
if y[1]=='S':
nums.append(num)
else:
dfs(num,y)
for w in r_list:
if w[0]=='A':
dfs(w[2],w)
print(min(nums))
货物摆放
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足n=L×W×H。
给定 nn,请问有多少种堆放货物的方案满足要求。
例如,当 n=4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当 n = 2021041820210418(注意有 16 位数字)时,总共有多少种方案?
思路
题目要我们找到满足n=L×W×H的方案有多少个,很自然的想到遍历所有数,找到符合条件的三个数的方法,但是这样花费时间太多,我们注意到L,W,H这三个数都可以整除n的数,所以我们先找到n的所有约数,然后在约数中即可
代码
n=2021041820210418
cnt=0
ans=[]
for i in range(1,int((n)**0.5+1)):
if n%i==0 :
ans.append(i)
ans.append(n//i)
for i in ans:
for j in ans:
if (n/i)%j==0:
cnt+=1
print(cnt)