第十四届蓝桥杯省赛C组

试题A:求和

  • 题目:求1(含)至20230408(含)中的每个数的和
sum=0
for i in range(1,20230409):
    sum+=i
print(sum)#204634714038436
  • 结果:204634714038436

试题B:分糖果

def dfs(x, a, b):#x表示第几个小朋友,a表示第一种糖果数量;b表示第二种糖果数量
    global sum#计数
    if x == 8:#当前为第8个小朋友
        if a == 0 and b == 0:#两种糖果都分完了
            # 如果七个人恰好分完则计数加一
            sum += 1
        return
    for i in range(a + 1):
        for j in range(b + 1):
            if i + j >= 2 and i + j <= 5:
                # 只有满足2-5的条件才可以
                dfs(x + 1, a - i, b - j)
sum = 0
dfs(1, 9, 16)
print(sum)
  • 最后结果:5067671

试题C:三国游戏

题解:贪心

  • 列举三个国家分别获胜的情况下,最大的事件数,取最大值
n = int(input())#读入n
a = list(map(int, input().split()))#读入Ai
b = list(map(int, input().split()))#读入Bi
c = list(map(int, input().split()))#读入Ci
def get(x, y, z):#在x获胜的情况下,最多发生多少个事件
    t = [x[i] - y[i] - z[i] for i in range(n)]# 计算 x 获胜对结果的贡献
    t.sort(reverse=True)# 将贡献按降序排序
    for i in range(n):
        t[i] += t[i - 1] if i > 0 else 0# 计算累积贡献和
        if t[i] <= 0:# 返回在累积贡献和变为非正之前发生的事件数
            return i
    return n # 如果所有事件都可以发生,返回 n

res = max(get(a, b, c), get(b, a, c), get(c, a, b))# 计算每种获胜情况下的最大事件数,并选择最大值
print(-1 if res == 0 else res) # 打印结果(如果没有事件发生则为 -1,否则为最大事件数)

试题D:平均

题解

n = int(input())  # 输入数据组数
s = [[] for i in range(10)]  # 创建一个长度为10的空列表,用于存储输入数据
for i in range(n):
    a, b = map(int, input().split())  # 输入a和b
    s[a].append(b)  # 将b添加到对应索引的子列表中
for i in range(10):
    s[i].sort()  # 对每个子列表进行排序
res, c = 0, n // 10  # 初始化多余代价为0,计算每个子列表允许的最大长度
for i in range(10):
    if len(s[i]) > c:  # 如果子列表的长度超过允许长度
        res += sum(s[i][:len(s[i]) - c])  # s[i]表示当前超过长度的子列表,总长度减去标准长度c等于要去掉的,统计排序号的当前列表要删去的值,并累加到多余代价中
print(res)  # 输出多余代价

试题E:填充

题解

  • 分析:先读入串,遍历串,每一个?都可以选择0/1,统计子串数并更新为较大的输出
s = input()
cnt = 0
i = 0
while i < len(s) - 1:
    if s[i] == s[i + 1] or s[i] == '?' or s[i + 1] == '?':
        cnt += 1#两个相邻字符相同总数加1
        i += 2#由于要求互不重叠,当有相同字符时,直接移2步
    else:#不相等的情况移一步
        i += 1
print(cnt)

试题F:棋盘

题解:暴力

#用一个二维数组存棋盘,根据读入的坐标将对应的棋子取反
n,m=map(int,input().split())
#根据n生成一个全白的棋盘
x=[[0]*n for _ in range(n)]
#读入操作
for i in range(m):
    a,b,c,d=map(int,input().split())
    for j in range(a-1,c):
        for k in range (b-1,d):
            if x[j][k]==0:
                x[j][k] = 1
            else:
                x[j][k] = 0
print(''.join(str(x) for x in x[0]))
print(''.join(str(x) for x in x[1]))
print(''.join(str(x) for x in x[2]))

题解:二维差分

n, m = map(int, input().split())
g = [[0] * (n + 2) for _ in range(n + 2)]#初始化二维差分数组
#构建二维差分数组
for _ in range(m):
    x1, y1, x2, y2 = map(int, input().split())
    g[x1][y1] += 1
    g[x2 + 1][y1] -= 1
    g[x1][y2 + 1] -= 1
    g[x2 + 1][y2 + 1] += 1
#根据二维差分数组得到前缀和数组
for i in range(1, n + 1):
    for j in range(1, n + 1):
        g[i][j] += g[i - 1][j] + g[i][j - 1] - g[i - 1][j - 1]

for i in range(1, n + 1):
    for j in range(1, n + 1):
        if g[i][j] % 2==0:#如果操作次数为偶数,棋子为白
            print(0, end="")
        else:#如果操作次数为奇数,棋子为黑
            print(1, end="")
    print()
  • 这个代码思路正确,换成其他语言为100分,由于python特性,时间超限,只有36分,没有找到100分代码,欢迎补充!

试题G:翻转

题解:模拟

  • 坑点:#如果不判断前后相等,导致结果错误,具体原因尚未找到
n=int(input())
for _ in range(n):
    t, s = input(), input() # 转成列表才能改
    s = list(s)
    n, ans = len(s), 0 # 字符串长度 答案
    for i in range(n): # 遍历 s
        if s[i] != t[i]: # 发现有跟 t 不一样的字符
            if 0 < i < n - 1 and s[i - 1] != s[i] and s[i + 1] != s[i] and s[i - 1] == s[i + 1]:#如果不判断前后相等,导致结果错误
                s[i] = t[i]
                ans += 1
            else: # 否则无解
                ans = -1
                break
    print(ans)

试题H:异或和之差

  • trie树、DP、枚举

试题H:小蓝的旅行计划

  • 线段树+优先队列

posted @ 2024-04-02 10:48  Frommoon  阅读(145)  评论(0编辑  收藏  举报