23蓝桥杯算法c组python题解(二)

第三题  三国游戏:详细题目如下

问题分析:

        根据题意可知,我们需要找出每个国家获胜分别最多发生的事件数量,最后再选择三者中事件最多的即可。可以利用贪心思想,通过寻找局部最优,来得到总体最优。

代码如下:
import os
import sys

# 贪心算法:先找局部最优,最后得到总体最优解
n = int(input())

A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))

# 定义一个函数来寻找其中一个赢得胜利的事件发生的最大次数
def win(A, B, C): # 假设A获胜(A可以是魏蜀吴三家)
  Win_times = []
  ans = 0

  for i in range(n):
    w = (A[i] - B[i] - C[i]) #记录各次时间中A增加的兵力是否大于二者之和
    Win_times.append(w)
  Win_times = sorted(Win_times, reverse=True) # 将记录的事件结果从大到小排序
  counter = 0
  
  for w in Win_times: #从大到小检测记录的事件结果,大于零则事件计数器加一,小于0则退出循坏
    ans += w
    counter += 1
    if ans <= 0:
      break
  
  if counter < 2: # counter小于2则说明,记录的第一个事件就小于0,即最大的小于0,则该国无法获胜
    return -1
  else:
    return (counter-1)
  
Times_things = max(win(A, B, C), win(B, A, C), win(C,B,A))
print(Times_things)
第四题 平均:

       

问题分析:

        本题可以利用空间换时间的思想。首先,构建哈希表来重新存储数组数据。哈希表的结构如下:{key = a_{i} \in [0,9] : value = [b_{i}] },依次将数组中的数据存入,哈希表的键为数a_{i},相对于的值为修改a_{i}所需要的代价b_{i}所组成的列表。之后,遍历哈希表,查看每个键所对应的列表长度,当列表长度大于题目所要求的平均长度时,则选择列表中前x代价加入总代价(x为列表长度减去平均长度)。注意,本题只要求我们计算修改代价,无需纠结如何修改,只需将多于平均长度的数的代价加入计算即可。

代码如下:
import os
import sys
import collections

n = int(input())
nums_dj = []
for _ in range(n):
  nums_dj.append([int(i) for i in input().split()])

average_time = n // 10
cost = 0

# 建立哈希表进行存储
mp = collections.defaultdict(list)
for i in range(n):
  key = nums_dj[i][0]
  value = nums_dj[i][1]
  mp[key].append(value)

for key, values in mp.items():
  if len(values) > average_time:
    for j in range(len(values) - average_time):
      values_sorted = sorted(values)
      cost += values_sorted[j]

print(cost)
第五题 填充 

        

        

问题分析:

        本题因为一次需要判断两个字符,可以采用双指针的方法。具体逻辑为,定义一个 left = 0指针和 right = left + 1指针从字符最左侧开始遍历。判断left是否等于right,或者是否其中至少有一个指针为'?'字符:若判断成功,则计数器加一,left直接加2,right = left + 1;否则, left = left + 1, rght = left + 1。

代码如下:
import os
import sys

strings = input()

# 双指针
counter = 0
left = 0
right = left + 1
while left < len(strings) - 1:
  if strings[left] == strings[right] or strings[left] == '?' or strings[right] == '?':
    counter += 1
    left += 2
    right = left + 1
  else:
    left += 1
    right = left + 1

print(counter)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯是一个国内著名的计算机比赛,为了帮助参赛者更好地准备和了解比赛的题型,委会会公布历年的真题并提供相应的题解。 首先,我们需要了解蓝桥杯是一个综合性的计算机比赛,测试的对象包括计算机基础知识、编程能力以及解决实际问题的能力。 在历年的真题中,参赛者将面临不同类型的题目,包括算法设计与优化问题、数据结构与算法问题、编程题等。其中针对Python B的题目主要考察的是对Python语言的掌握和应用能力。 题目解答一般会包含以下几个方面的内容: 1. 题目分析与理解:读取题目,理解题目的要求和限制条件。通过仔细分析题目,确定题目的输入与输出,以及问题的核心。 2. 设计解决方案:根据题目要求和限制条件,设计一个合适的解决方案。可以使用合适的算法和数据结构来解决问题,并做出相应的性能优化。 3. 编写代码实现:根据设计的方案编写相应的代码实现。需要注意的是,Python语言有其独特的语法和特性,掌握好这些特性可以更好地完成编程任务。 4. 调试与测试:编写完代码后,需要进行调试和测试。通过运行样例输入和输出,检查代码是否符合题目要求,并且没有逻辑上的错误。 5. 总结与优化:在完成题目解答后,可以进行总结和优化。包括分析算法复杂度、代码风格和可读性等方面,以便在比赛中更好地表现。 在准备蓝桥杯时,可以通过阅读历年的真题和题解来了解比赛的难度和类型,针对性地进行练习和提高。同时也可以参加相关的培训班和讨论活动,与其他参赛者交流经验和技巧。 总而言之,历年蓝桥杯真题的解答对于提高自己的编程能力和应对比赛非常有帮助。通过认真分析和实践,可以更好地理解并掌握Python编程,并在比赛中取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值