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