IT评测·应用市场-qidao123.com技术社区

标题: 2024年 蓝桥杯 Python A组题目分析与解说 [打印本页]

作者: 张春    时间: 2025-4-4 05:08
标题: 2024年 蓝桥杯 Python A组题目分析与解说
D.回文数组

D.回文数组



  1. n = int(input())
  2. a = list(map(int,input().split()))
  3. cha = [0]*(n//2)
  4. # 得到相差的数组
  5. for i in range(n//2):
  6.   cha[i] = a[i] - a[n-1-i]
  7. # 开始贪心枚举
  8. ans = 0
  9. # 由于要判断后一个的情况,所以最后一个要单独判断
  10. for i in range(n//2-1):
  11.   if cha[i] == 0:
  12.     continue
  13.   # 同号的问题
  14.   if cha[i]*cha[i+1] > 0:
  15.     change = min(abs(cha[i]),abs(cha[i+1]))
  16.     ans += change
  17.     # 如果是正数
  18.     if cha[i] > 0:
  19.       cha[i],cha[i+1] = cha[i]-change,cha[i+1]-change
  20.            # 如果是负数
  21.     else:
  22.       cha[i],cha[i+1] = cha[i]+change,cha[i+1]+change
  23.   # 如果两个对象的操作没使得当前cha[i]==0,或者是情况3,也就是cha[i]与cha[i+1不同号
  24.   if cha[i] == 0:
  25.     continue
  26.   else:
  27.     ans += abs(cha[i])
  28. ans += abs(cha[-1])
  29. print(ans)
复制代码
F.砍柴

F.砍柴





  • 对于这个最优策略的题目:

    • 起首,每次的选择都是选择一个质数,所以你得起首先把最大范围内的质数全部筛选出来,在这里我们使用欧拉筛举行筛选
    • 对于最优策略的题目,起首考虑可以使用一个dp数组来记载对应的n所对应的环境下,小蓝可否获胜, 对于当前的n,假如在找到一个dp[n-p]=0,则说明小蓝是可以获胜的,否则就不可

   美中不敷的是,这个代码的时间复杂度过高,只能通过10/20的测试用例,对于最后的dp数组的求解,假如改为10**5+1,则代码会运行很久
  1. # 总体来说,就是不断的遍历吧
  2. # 首先求解出全部的质数,对于当前的选择,枚举这个<=x的质数,通过这个记忆化很快可以知道
  3. dp = [0]*(10**5+1)
  4. dp[2],dp[3] = 1,1
  5. zhistore = set()
  6. iszhi = [True]*(10**5+1)
  7. iszhi[0],iszhi[1] = False,False
  8. # 使用质数筛,得到 10**5范围内全部的质数
  9. for i in range(2,10**5+1):
  10.   if iszhi[i]:
  11.     zhistore.add(i)
  12.   for j in zhistore:
  13.     if i * j > 10**5:
  14.       break
  15.     iszhi[i*j] = False
  16. # 全部的质数都存储在这个iszhi中
  17. isprime = [i for i,c in enumerate(iszhi) if c == True]
  18. for i in range(4,10**4+1):
  19.   # 小蓝所做出的选择j
  20.   flag = 0
  21.   if iszhi[i]:
  22.     dp[i] = 1
  23.     continue
  24.   for j in isprime:
  25.     if j>i:
  26.       break
  27.     if dp[i-j] == 0:
  28.       # 表示找到了
  29.       flag = 1
  30.       dp[i] = 1
  31.       break
  32. T = int(input())
  33. for _ in range(T):
  34.   n = int(input())
  35.   print(dp[n])
复制代码


  • 后面颠末检查,发现照旧这个动态规划存在题目,原本的代码使用的是对于当前的i,查询是否存在减去质数的dp[]是必败的状态,这样的话,服从会十分慢,精确的做法应该是 找到必败的状态dp == 0,然后遍历质数,当前的必败状态i+p的时候对于小蓝来说就是必赢的状态
  1. # 总体来说,就是不断的遍历吧
  2. # 首先求解出全部的质数,对于当前的选择,枚举这个<=x的质数,通过这个记忆化很快可以知道
  3. dp = [0]*(10**5+1)
  4. dp[2],dp[3] = 1,1
  5. zhistore = []
  6. iszhi = [True]*(10**5+1)
  7. iszhi[0],iszhi[1] = False,False
  8. # 使用质数筛,得到 10**5范围内全部的质数
  9. for i in range(2,10**5+1):
  10.   if iszhi[i]:
  11.     zhistore.append(i)
  12.   for j in zhistore:
  13.     if i * j > 10**5:
  14.       break
  15.     iszhi[i*j] = False
  16.     if i % j == 0:
  17.       break
  18. # 全部的质数都存储在这个iszhi中
  19. isprime = [i for i,c in enumerate(iszhi) if c == True]
  20. for i in range(4,10**5+1):
  21.   if dp[i] == 0:
  22.     for j in isprime:
  23.       if i + j < 10**5:
  24.         dp[j] = 1
  25.         
  26. T = int(input())
  27. for _ in range(T):
  28.   n = int(input())
  29.   print(dp[n])
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4