2025蓝桥杯

 A:攻击次数

题目其实有歧义,没说明只能操作一个英雄还是所有英雄都可使用,所以答案可能为181或103

个人看法,如果是操作一个最优的英雄,题目应该是问最快第几回合结束,而不是仅仅问第几回合结束

这边只展示了所有英雄可操作的代码

注意回合从1开始,结果需要-1

r = 2025

k = 1
while r > 0:
    r -= 5
    if k % 2 == 1:
        r -= 15
    else:
        r -= 2
    if k % 3 == 1:
        r -= 2
    elif k % 3 == 2:
        r -= 10
    else:
        r -= 7
    k += 1

print(k - 1)

B:最长字符串

此题可以不用文件读写,利用字符串分割换行符即可,这边数据量有点大,利用小数据展示代码,大家可以负责全部数据到s即可

s = '''
b
bc
cbd
dbca
'''

s = s.split('\n')

g = sorted(set(s),key=lambda x:(len(x),x))

n = len(s)
v = set()
ans = ''
mx = -1
dd = []
for x in g:
    m = len(x)
    if m == 1:
        v.add(x)
        ans = x
        mx = 1
        dd.append(x)
    else:
        t = list(map(str,x[:-1]))
        t.sort()
        t = ''.join(t)
        if t in v:
            dd.append(x)
            if m == mx:
                mx = m
                ans = min(ans,x)
            elif m > mx:
                mx = m
                ans = x
            kk = list(map(str, x))
            kk.sort()
            kk = ''.join(kk)
            v.add(kk)

dd = list(set(dd))
dd = sorted(dd,key=lambda x:len(x))
# print(dd)
print(ans)

C:LQ图形

模拟即可

w,h,v = map(int,input().split())

ans = []

for i in range(h):
    r = []
    for j in range(w):
        r.append("Q")
    ans.append(r.copy())

for i in range(w):
    r = []
    for j in range(v + w):
        r.append("Q")
    ans.append(r.copy())

for row in ans:
    print(''.join(row))

D:最多次数

贪心模拟即可

s = input()
n = len(s)
v = [False] * n
if n <= 2:
    print(0)
else:
    d = ['lqb','lbq','qlb','qbl','blq','bql']
    ans = 0
    for i in range(2,n):
        t = s[i-2:i+1]
        if t in d and not v[i - 2] and not v[i - 1]:
            v[i] = True
            ans += 1
    print(ans)

# lqbblqblqlxqb

E:A * B Problem

预处理两个乘积的结果,枚举因子

前缀和处理

l = int(input())

def f2(l):
    v = [0] * (l + 1)
    from math import sqrt
    for i in range(1,l+1):
        for j in range(i,(l // i) + 1):
            if i * j <= l:
                v[i * j] += 1

    for i in range(l + 1):
        v[i] *= 2
        j = sqrt(i)
        if int(j) == j:
            v[i] -= 1

    p = [0]
    for i in range(1,l+1):
        p.append(p[-1] + v[i])

    # print(v)
    ans = 0
    for i in range(1,l+1):
        d = l - i
        ans += v[i] * p[d]
    # print(ans)
    return ans

def f1(l):
    ans = 0
    for x1 in range(1,l + 1):
        for y1 in range(1, l + 1):
            for x2 in range(1, l + 1):
                for y2 in range(1, l + 1):
                    if x1 * x2 + y1 * y2 <= l:
                        # print((x1,x2),(y1,y2))
                        ans += 1
    return ans

# for l in range(1,100):
#     a1,a2 = f1(l),f2(l)
#     print(f"第{l}轮:",end=' ')
#     if a1 != a2:
#         print("WA")


print(f2(l))

F:园艺

n^2动态规划

n = int(input())

a = list(map(int,input().split()))

dp = [[1] * (n + 1) for i in range(n)]

for i in range(n):
    for j in range(i):
        if a[i] > a[j]:
            d = i - j
            dp[i][d] = max(dp[i][d],dp[j][d] + 1)

ans = -1
for row in dp:
    ans = max(ans,max(row))
print(ans)

 G:书架还原

找环,答案为每个环的节点个数-1之和

n = int(input())

a = list(map(int,input().split()))

v = [False] * n

pa = [-1] * n
for i in range(n):
    pa[i] = a[i] - 1

ans = 0
for i in range(n):
    if pa[i] == i or v[i]:
        continue
    stk = [i]
    c = 0
    while stk:
        u = stk.pop()
        if v[u]:
            continue
        c += 1
        v[u] = True
        stk.append(pa[u])
    ans += (c - 1)

print(ans)

# 3
# 3 1 2

# 5
# 1 2 3 4 5

# 5
# 5 4 3 2 1

H:异或和

 考虑每一位数的贡献,复杂度为20n

n = int(input())
a = list(map(int,input().split()))


mx = len(bin(max(a))) - 2

ans = 0

d1 = [0] * (mx + 1)
d0 = [0] * (mx + 1)
c1 = [0] * (mx + 1)
c0 = [0] * (mx + 1)
for x in a:
    for i in range(mx):
        if x >> i & 1:
            ans += d0[i] * (2 ** i)
            c1[i] += 1
        else:
            ans += d1[i] * (2 ** i)
            c0[i] += 1
        d1[i] += c1[i]
        d0[i] += c0[i]

print(ans)

# 3
# 1 2 3
#
# 4
# 9 8 7 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值