2023年蓝桥杯 省赛真题
Python大学A组
试题A:特殊日期
试题B:分糖果
试题C:三国游戏
试题D:平均
试题E:翻转
试题F:子矩阵
试题G:阶乘的和
试题H:奇怪的数
试题I:子树的大小
试题J:反异或01串
试题A:特殊日期 (5分)
【问题描述】
记一个日期为 yy 年 mm 月 dd 日,统计从 2000 年 1 月 1 日到 2000000 年 1 月 1 日:有多少个日期满足年份 yy 是月份 mm 的倍数,同时也是 dd 的倍数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
【解析与方法】
最简单粗暴的方法就是直接从2000年1月1日遍历到2000000年1月1日,使用这种方法写建议使用C++来写,运行速度快一些,Python跑的满。Python虽然有比较好用的datetime包,但是Python的datetime对象可以表示的日期范围从公元1年1月1日到公元9999年12月31日。题目给的最大日期已经超了,一跑就报错。所以还是直接暴力跑方便点且不容易出错。
【Python程序代码】
mon = [0,31,28,31,30,31,30,31,31,30,31,30,31] def run(x): #判断是否为闰年 if x%400==0 or (x%4==0 and x%100!=0): return True return False res = 0 for year in range(2000,2000000): if run(year): mon[2]=29 else: mon[2]=28 for mm in range(1,13): for dd in range(1,mon[mm]+1): if year%mm==0 and year%dd==0: res += 1 print(res+1) #前面只迭代到了1999999年12月31日,最后2000000年1月1日也是一个答案
最终结果为:35813063
拓展:datetime对象的使用方法
from datetime import datetime, timedelta # 定义开始和结束日期 start_date = datetime(2023, 1, 1) end_date = datetime(2024, 1, 1) # 定义时间间隔 delta = timedelta(days=1) # 迭代日期范围 while start_date =a[i] and c2>=b[i]: dfs(u+1,c1-a[i],c2-b[i]) dfs(0,9,16) print(ans)
最终结果:5067671
试题C:三国游戏 (10分)
【问题描述】
小蓝正在玩一款游戏,游戏中魏(X)、蜀(Y)、吴(Z)三个国家各自拥有一定数量的士兵X、Y、Z(一开始可以认为都是0)。游戏有n个可能会发送的事件,每个事件之间相互独立且最多只发送一次,当第i个事件发送时会分别让X、Y、Z增加
.
当游戏结束时(所以事件的发生与否已经确定),如果X,Y,Z的其中一个大于另外两个之和,我们认为其获胜。例如,当X>Y+Z时,我们认为魏国获胜,小蓝想知道游戏结束时,如果有其中一个国家获胜,最多发生了多少个事件?如果不存在任何一个让某个国家获胜的情况,请输出-1。
【输入格式】
输入的第一行包含一个整数n。
第二行包含n个整数表示A,相邻整数之间使用一个空格分隔
第三行包含n个整数表示B,相整数之间使用一个空格分隔
第四行包含n个整数表示C,相邻整数之间使用一个空格分隔
【输出格式】
输出一行包括一个整数表示答案。
【样例输入】
3 1 2 2 2 3 2 1 0 7
【样例输出】
2
【测评用例与规模】
对于 40% 的评测用例,n
对于 70%的评测用例,nY+Z的情况,此时并不表示某魏国获胜了。而是要等到全部事情发生后比对X与Y+Z的情况才能判断(省赛中误解了导致寄掉了)。理解后难度就直行下降了。因此可以枚举魏、蜀、吴三个国家想要获胜最多事情数量,然后取最大值即是答案。
假设魏国获胜:令new_X =[ Ai - Bi - Ci]. 10:ans = max(ans,resZ) if sum_X=0 and i+1