本人菜鸡一枚,本帖子仅用来记录我自己本次蓝桥杯的思路和代码,如有错误请各位大佬指正。
试题A: 攻击次数
简单的模拟,记录life为2025,根据题目信息对各英雄攻击值进行取余计算即可,算出来结果是103
暴力+模拟
life = 2025 #生命
time = 1 #回合
while life > 0:
life -= 5 # 1英雄攻击
if time % 2 == 1: #2
life -= 15
else:
life -= 2
if time % 3 == 1: #3
life -= 2
elif time % 3 == 2:
life -= 10
elif time % 3 == 0:
life -= 7
print("第",time,"回合:",life)
if life > 0:
time += 1
### ans = 103
试题B: 最长字符串
这里可以直接暴力求解,根据定义单个字母一定是优美字符串,根据字符长度划分不同的字符组,首先求得长度为2的字符串中符合优美的,也就是说其首字母中,在单字符串集合中必定存在,以此类推,层层计算。最后根据字典序排序即为答案。答案为:afplcu
暴力+哈希
word2 = []
word3 = []
word4 = []
word_f = []
word_five = []
word_s = []
word_seven = []
for i in range(50000):
n = input()
if len(n) == 2:
word2.append("".join(sorted(n)))
if len(n) == 3:
word3.append(n)
if len(n) == 4:
word_f.append(n)
if len(n) == 5:
word_five.append(n)
if len(n) == 6:
word_s.append(n)
if len(n) == 7:
word_seven.append(n)
for i in word3:
if "".join(sorted(i[:-1])) in word2:
word4.append("".join(sorted(i)))
print(word4)
word5 = []
for i in word_f:
if "".join(sorted(i[:-1])) in word4:
word5.append("".join(sorted(i)))
print(word5)
word6 = []
for i in word_five:
if "".join(sorted(i[:-1])) in word5:
word6.append("".join(sorted(i)))
print(word6)
word7 = []
word8 = []
for i in word_s:
if "".join(sorted(i[:-1])) in word6:
word8.append(i)
word7.append("".join(sorted(i)))
print(sorted(word8))
print("sort")
print(word7)
## afplcu
试题C: LQ 图形
又是一道简单的模拟题,根据题目要求,输出图形高为h+w,前h高时,宽为w,后面宽为w+v,循环模拟输出即可。
模拟+循环
w , h ,v = list(map(int,input().split()))
for i in range(w+h):
if i < h:
print("Q"*w)
else:
print("Q"*(w+v))
试题D: 最多次数
这题我写的时候用的是贪心的思想,维护一个长度为3的滑动窗口,使用哈希映射窗口的字符是否符合题意,符合就ans += 1,窗口后滑三格,否则窗口后滑一格,继续判断。
贪心+滑动窗口+哈希
s = list(input())
love = {"lqb","lbq","qlb","qbl","blq","bql"}
love_new = []
for i in love:
love_new.append(list(i))
if len(s) < 3:
print(0)
else:
ans = 0
l = 0
r = 2
while r < len(s):
window = s[l:r+1]
if window in love_new:
ans += 1
l += 3
r += 3
else:
l += 1
r += 1
print(ans)
试题E: A ·B Problem
这道题我对bp不熟悉,只能使用暴力求解,应该能过部分样例,直接模拟四个数,循环判断,符合条件则ans += 1。
纯暴力+模拟
L = int(input())
ans = 0
for i in range(1,L+1):
for j in range(1,L+1):
for k in range(1,L+1):
for g in range(1,L+1):
if i * k + j * g <= L:
ans += 1
print(ans)
试题F: 园艺
这题没时间下了最后写了个random函数随机输出骗分。
投降
n = int(input())
no = []
h = list(map(int,input().split()))
import random
if sorted(h) == h:
print(n)
else:
print(random.randint(0,n))
试题G: 书架还原
这里我用的贪心算法。每次操作都把当前位置上编号不对的书交换到正确的位置,这样就能保证用最少的操作次数让书架上的书恢复到正确排列。同时用字典映射书本的当前位置,提高查询效率。
贪心+哈希
n = int(input())
a = list(map(int, input().split()))
i = 1
ans = 0
a_dict = {}
for sam in range(n):
a_dict[a[sam]] = sam # 记录位置
while i <= n:
if a[i - 1] == i:
i += 1
else:
ans += 1
local = a_dict.get(i) # 找到位置,交换
t = a[i - 1]
a[i - 1] = a[local]
a[local] = t
a_dict[a[i - 1]] = i - 1
a_dict[a[local]] = local
i += 1
print(ans)
试题H: 异或和
这里直接纯暴力计算,写了一个双循环求解,应该能过部分样例。
暴力+模拟
n = int(input())
a = list(map(int,input().split()))
ans = 0
for i in range(n):
for j in range(i+1,n):
ans += (a[i]^a[j])*(j - i)
print(ans)