成绩统计
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
思路
遍历输入全体即可,值得注意的是这道题中用到round(),意为取整函数,以及最后要用f'{}'连接字符串和数字
代码
1. n=int(input()) 2. a=[] 3. for i in range(n): 4. b=int(input()) 5. a.append(b) 6. ans1,ans2=0,0 7. for i in range(n): 8. if 60<=a[i]: 9. ans1+=1 10. if 85<=a[i]: 11. ans2+=1 12. 13. x=round(ans1/n*100) 14. y=round(ans2/n*100) 15. print(f'{x}%') 16. print(f'{y}%')
单词分析
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
输入描述
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
输出描述
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
思路
遍历输入字符串,计算出每个字母的数量,记录最大出现次数和该字母
代码
1. s=input() 2. ls="abcdefghijklmnopqrstuvwxyz" 3. max1=0 4. ans="" 5. for j in ls: 6. cnt=0 7. for i in range(len(s)): 8. if j==s[i]: 9. cnt+=1 10. if cnt>max1: 11. max1=cnt 12. ans=j 13. print(ans) 14. 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 型的回文日期。
思路
将字符传转化成日期格式,让日期自增,再将日期格式转化成字符串,判断是否满足要求
代码
1. import datetime 2. 3. data=input() 4. y=int(data[:4]) 5. m=int(data[4:6]) 6. d=int(data[6:8]) 7. day1=datetime.date(y,m,d) 8. 9. flag=1 10. 11. for n in range(9999): 12. day1=day1+datetime.timedelta(days=1) 13. s=str(day1).replace("-","") 14. 15. if s==s[::-1]: 16. if flag: 17. print(s) 18. flag=0 19. if s[1]==s[3]==s[4]==s[6]: 20. print(s) 21. break
最短路
如下图所示,G是一个无向图,其中蓝色边的长度是 1、橘色边的长度是 2、绿色边的长度是 3。则从 A 到 S 的最短距离是多少?
思路
这道题可以直接从图中看出来,最小值是6,但我们为了学习一下深度优先搜索,这里认真做一下。 深搜的思路是从A开始出发,向他的邻接点深度搜索,每次深入增加num,即此路径的边长之和。如果找到了S,停止递归,将num存储在列表中。最终输出该列表的最小值,就是我们要的最小路径。
代码
1. r_list = [ 2. ["A", "E", 1], 3. ["A", "B", 2], 4. ["A", "C", 1], 5. ["A", "D", 1], 6. ["A", "E", 1], 7. ["B", "G", 1], 8. ["B", "J", 2], 9. ["C", "D", 3], 10. ["C", "G", 3], 11. ["C", "F", 3], 12. ["D", "G", 2], 13. ["D", "H", 1], 14. ["D", "I", 2], 15. ["E", "H", 1], 16. ["E", "I", 3], 17. ["F", "J", 1], 18. ["F", "G", 1], 19. ["G", "K", 2], 20. ["G", "I", 3], 21. ["H", "L", 2], 22. ["H", "I", 1], 23. ["I", "M", 3], 24. ["J", "S", 2], 25. ["K", "N", 1], 26. ["K", "L", 3], 27. ["L", "R", 1], 28. ["L", "M", 1], 29. ["M", "N", 2], 30. ["M", "Q", 1], 31. ["M", "S", 1], 32. ["N", "P", 1], 33. ["Q", "O", 1], 34. ["O", "R", 3], 35. ["P", "O", 1], 36. ["R", "S", 1], 37. ] 38. 39. nums=[] 40. 41. def dfs(num,r): 42. for y in r_list: 43. if y[0]==r[1]: 44. num+=y[2] 45. if y[1]=='S': 46. nums.append(num) 47. else: 48. dfs(num,y) 49. for w in r_list: 50. 51. if w[0]=='A': 52. dfs(w[2],w) 53. 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的所有约数,然后在约数中即可
代码
1. n=2021041820210418 2. cnt=0 3. 4. ans=[] 5. for i in range(1,int((n)**0.5+1)): 6. if n%i==0 : 7. ans.append(i) 8. ans.append(n//i) 9. 10. for i in ans: 11. for j in ans: 12. if (n/i)%j==0: 13. cnt+=1 14. print(cnt)