第十四届蓝桥杯大赛软件赛省赛(Python大学A组)

慈云数据 12个月前 (03-20) 技术支持 80 0

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增加A_{i} B_{i} C_{i}.

        当游戏结束时(所以事件的发生与否已经确定),如果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

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon