第十四届蓝桥杯 python c组省赛

感觉难度还是有点高,先写了部分简单的,如有不对还请大佬指点指点

第十四届蓝桥杯 python c组

  • A: 求和 (填空)
  • B: 分糖果 (填空)
  • C:三国游戏
  • D: 平均
  • F: 棋盘

A: 求和 (填空)

题意概括:
求 1 (含)至 20230408 (含)中每个数的和。

思路:
没啥好说的,送分题直接暴力

print(sum(i for i in range(1, 20230409))) # 204634714038436

B: 分糖果 (填空)

题意概括:
两种糖果分别有 9 个和 16 个,要全部分给 7 个小朋友,每个小朋友得到的糖果总数最少为 2 个最多为 5 个,问有多少种不同的分法。
只要有其中一个小朋友在两种方案中分到的糖果不完全相同,这两种方案就算作不同的方案。

思路:
dfs暴搜每个孩子拿到每种组合的糖果的方案数

res = 0


# 第i个孩子,第一种糖果和第二种糖果剩余的数量
def dfs(i, t1, t2):
    global res
    if i == 6: # 最后一个孩子
        if 2 <= t1 + t2 <= 5: # 剩余的糖果
            res += 1
            # print(res)
        return
    # 分两个
    for j in range(3):
        if t1 - j >= 0 and t2 - 2 + j >= 0:
            dfs(i + 1, t1 - j, t2 - 2 + j)
    # 分三个
    for j in range(4):
        if t1 - j >= 0 and t2 - 3 + j >= 0:
            dfs(i + 1, t1 - j, t2 - 3 + j)
    # 分四个
    for j in range(5):
        if t1 - j >= 0 and t2 - 4 + j >= 0:
            dfs(i + 1, t1 - j, t2 - 4 + j)
    # 分五个
    for j in range(6):
        if t1 - j >= 0 and t2 - 5 + j >= 0:
            dfs(i + 1, t1 - j, t2 - 5 + j)


dfs(0, 9, 16)
print(res)  # 5067671

C:三国游戏

题目:
小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X; Y; Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X; Y; Z 增加Ai; Bi; Ci 。
当游戏结束时 (所有事件的发生与否已经确定),如果 X; Y; Z 的其中一个大于另外两个之和,我们认为其获胜。例如,当 X > Y + Z 时,我们认为魏国获胜。小蓝想知道游戏结束时如果有其中一个国家获胜,最多发生了多少个事件?
如果不存在任何能让某国获胜的情况,请输出 −1。

思路
贪心,分别考虑三个国家获胜的情况,因为每个事件相互独立,那么不管发生顺序,先将该次事件该国增加士兵减去其余两个国家增加士兵的数量倒序排序,然后依次累加士兵数量,直到当前该国士兵小于等于其他两国之和。

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


def get_ans(i):
    AL.sort(key=lambda f: sum(f)-2*f[i])
    res = -1
    cur = [0, 0, 0]
    for k, (a, b, c) in enumerate(AL, 1):
        cur[0] += a
        cur[1] += b
        cur[2] += c
        if cur[i] <= sum(cur) - cur[i]:
            return res
        res = k
    return res


res = max(get_ans(0), get_ans(1), get_ans(2))
print(res)

D: 平均

题目:
有一个长度为 n 的数组(n 是 10 的倍数),每个数 ai 都是区间 [0; 9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于 10 n ),请问代价和最少为多少。

思路:
贪心+哈希表,因为每个数字出现的次数是确定好的,只需要统计大于应该出现次数的数字,对于每个大于应该出现次数的数字,取代价最小的几个转换。

from collections import defaultdict

n = int(input())
mp = defaultdict(list)
for _ in range(n):
    a, b = list(map(int, input().split()))
    mp[a].append(b)

x = n // 10  # 每个数字应该出现多少次
res = 0
for k, v in mp.items():
    if len(v) <= x: continue  # 出现次数小于等于应该出现的次数,不用转换
    v.sort()  # 换代价最小的
    res += sum(v[:len(v) - x])
print(res)

F: 棋盘

题目:
小蓝拥有 n × n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反 (也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。

思路:
二维差分数组模板题,直接套,输出的时候判断奇偶性,如果翻转了奇数次则是黑棋否则是白棋。

n, m = list(map(int, input().split()))
D = [[0] * (n + 2) for _ in range(n + 2)]  # 差分数组 

for _ in range(m):
    x1, y1, x2, y2 = list(map(int, input().split()))
    D[x1][y1] += 1
    D[x2+1][y1] -= 1
    D[x1][y2+1] -= 1
    D[x2+1][y2+1] += 1

for i in range(1, n+1):
    for j in range(1, n+1):
        D[i][j] += D[i-1][j] + D[i][j-1] - D[i-1][j-1]
        print(D[i][j] % 2, end='')
    print()

你可能感兴趣的:(蓝桥杯,python)