2024年 第15届蓝桥杯 省赛 python 研究生组 题解

文章介绍了几种编程解题策略,包括使用暴力法解决A题,利用阶乘的性质简化B题,借助动态数据结构如差分数组处理C题商品库存管理和D题区间修改,以及DFS和树状数组优化E题砍柴和H题植物生命力的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前排提醒:仅供参考,未经授权禁止转载。

A题 劲舞团

简单题,log.txt共2000行 ,暴力即可。

参考答案:9

n=2000
res=[]
for _ in range(2000):
    c,in_,t=input().split()
    res.append([c,in_,int(t)])
print(res)  
ans=0
n=len(res)

for i in range(n):
    if res[i][0]!=res[i][1]:
        continue
    st=i
    while i+1<n and res[i+1][0]==res[i+1][1] and res[i+1][2]-res[i][2]<=1000:
        i+=1
    ans=max(ans,i-st+1)
print(ans)

B题 召唤数学精灵

思路:

1.范围过大,无法暴力;

2.注意到B(i)为阶乘,其数值在10之后将全是100的倍数。因为n>10时,n!=1*2*...*5*...*10*......已经有2*5*10存在。

3.由2,只需考虑A(i)是否为100的倍数。 

                        A(i)=\frac{n(n+1)}{2}

因此只需[n(n+1)]mod(200)=0

考虑如下事实:

若对于某个x有:

x(x+1)mod(200)=0

即A(x)能被100整除,则:

(x+200)(x+201)=x^2+401x+200\times201=x(x+1)+400x+200 \times 201

显然也是200的倍数,因此只需要找出200以内满足要求的数字个数即可。

4.符合3中条件的200以内的x为:

24,175,199,200

共4个。

因此,满足条件的数字个数为:

2024041331404202//200*4+2=40480826628086

最后的2是10以内满足要求的数,即1,3

参考答案:40480826628086

C题 封闭图形个数

本题对于python来说直接秒杀,不多说。

from functools import  cmp_to_key
cnt=[1,0,0,0,1,0,1,0,2,1]
def get(num):
    res=0
    for w in str(num):
        res+=cnt[int(w)]
    return res
def f(a,b):
    if a==b:
        return 0
    x,y=get(a),get(b)
    if x==y:
        return -1 if a<b else 1
    elif x<y:
        return -1
    else:
        return 1

def solve():
    n=int(input())
    a=list(map(int,input().split()))
    a.sort(key=cmp_to_key(f))
    print(*a)
    
solve()

D题 商品库存管理

方法1:暴力,不多说。显然不能拿到所有分数

方法2:对于区间修改与查询,应该想到:差分数组,树状数组,线段树...etc

由于本题只是对区间整体加上同一个数(1),考虑使用差分数组。

若没有最后撤销执行操作,则只需要O(n)遍历数组,对0计数即可。

然而存在m个撤销操作,由于m范围较大,我们需要O(1)的找到撤销操作对答案的影响。

显然,这只要找到该撤销区间内1的个数即可。

O(1)获得某个区间内1的个数,用简单的前缀和即可解决。

最终时间复杂度为O(n+m)

n,m=map(int,input().split())
t=[]
for i in range(m):
    L,R=map(int,input().split())
    t.append((L-1,R-1))
    
dif=[0]*(n+1)
for L,R in t:
    dif[L]+=1
    dif[R+1]-=1

f=[0]
for d in dif:
    f.append(f[-1]+d)
f=f[1:-1]
cnt1=[0]
# print('final:',f)
for x in f:
    cnt1.append(cnt1[-1]+int(x==1))
cnt1=cnt1[1:]
# print('cnt1=',cnt1)
cnt0=sum([x==0 for x in f])
# print(cnt0)
for L,R in t:
    new=cnt1[R]-cnt1[L-1] if L>0 else cnt1[R]
    print(cnt0+new)

E题 砍柴 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值