蓝桥·算法赛——第07场

小白入门赛

1-thanks,mom

2-霓虹

dic = {
    '0' : "1111110",
    '1' : "0110000",
    '2' : "1101101",
    '3' : "1111001",
    '4' : "0110011",
    '5' : "1011011",
    '6' : "1011111",
    '7' : "1110000",
    '8' : "1111111",
    '9' : "1111011"
}

S = input(); T = input()
ans = 0
for i in range(len(S)):
    num1 = dic.get(S[i]); num2 = dic.get(T[i])
    for j in range(7):
        if num1[j] != num2[j]:
            ans += 1
print(ans)

3-奇偶排序

N = int(input())
A = sorted(list(map(int, input().split())))
temp = list() # 缓存偶数
for i in range(N):
    if A[i] % 2 != 0:
        print(A[i], end=" ")
    else:
        temp.append(A[i])
print(*temp)

4-可结合的元素对

from math import log2, ceil

N = int(input())
a = sorted(list(map(int, input().split())))
# 排序会造成顺序改变,但是当选出的两个数满足条件时
# 令初始序号较小的为i,则另一个为j
dic = {} # 记录元素出现个数

ans = 0
for _, ai in enumerate(a):  # 枚举 a[i]
    for k in range(ceil(log2(ai)), 31):  # 枚举 2 ^ k(2 ^ 30 >= 10 ^ 9)
        aj = (1 << k) - ai # 保证了 aj 大于 0
        ans += dic.get(aj, 0) # 只选择自身之前的组合
    # 后续才将 ai 放入 dic 中,避免重复计数已经和自身组合
    dic[ai] = dic.get(ai, 0) + 1
print(ans)

5-兽之泪

from queue import PriorityQueue

k, n = map(int, input().split())
x = [0] * (k + 1); y = [0] * (k + 1)
S = 0; Min1 = pow(10, 9) # S 记录 x 数组的和 Min 记录 y 数组的最小值
for i in range(1, k + 1):
    x[i], y[i] = map(int, input().split())
    S += x[i]; Min1 = min(Min1, y[i])

# 情况1:打最后一只怪兽
ans2 = S + (n - k) * Min1

# 情况2:不打最后一只怪兽
ans1 = 0; Q = PriorityQueue(); Min2 = pow(10, 9)
for i in range(1, k): # 不要最后一只
    Q.put((x[i], i)); Min2 = min(Min2, y[i])
for i in range(n, 0, -1):
    score, idx = Q.get()
    if score == Min2: # 从这之后一直选择 idx
        ans1 += score * i
        break
    ans1 += score
    Q.put((y[idx], idx))

print(ans1 if n < k else min(ans1, ans2))

6-矩阵X

from collections import deque

# 读入数据
n, m, n1, m1 = map(int, input().split())
lst = [[0] * m for _ in range(n)]
for i in range(n):
    temp = list(map(int, input().split()))
    for j in range(m):
        lst[i][j] = temp[j]

# 二维前缀和:求子矩阵的和 O(1)
S = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(1, m + 1):
        S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + lst[i - 1][j - 1]

# 二维单调队列:求子矩阵的最值 O(1)
# 1.先求出每行的(窗口为 m1)最大值和最小值
Max_row = [[0] * (m - m1 + 1) for _ in range(n)]
Min_row = [[0] * (m - m1 + 1) for _ in range(n)]
for i in range(n): # 针对每一行 lst[i]
    Q1 = deque(); Q2 = deque() # Q1 最大值单调递减 Q2 最小值单调递增
    for j in range(m):
        while Q1 and lst[i][Q1[-1]] <= lst[i][j]:
            Q1.pop() # 保持单调性
        while Q2 and lst[i][Q2[-1]] >= lst[i][j]:
            Q2.pop() # 保持单调性
        Q1.append(j); Q2.append(j)
        while Q1 and Q1[0] + m1 <= j:
            Q1.popleft() # 处理越界
        while Q2 and Q2[0] + m1 <= j:
            Q2.popleft() # 处理越界
        if j + 1 >= m1: # 保存答案
            Max_row[i][j - m1 + 1] = lst[i][Q1[0]]
            Min_row[i][j - m1 + 1] = lst[i][Q2[0]]
# 2.求出 Max_row 每一列(窗口为 n1)最大值 Max_row 每一列(窗口为 n1)最小值
Max = [[0] * (m -m1 + 1) for _ in range(n - n1 + 1)]
Min = [[0] * (m -m1 + 1) for _ in range(n - n1 + 1)]
for j in range(m -m1 + 1): # 针对 Max_row[][j]、Min_row[][j] 的每一列
    Q1 = deque(); Q2 = deque() # Q1 最大值单调递减 Q2 最小值单调递增
    for i in range(n):
        while Q1 and Max_row[Q1[-1]][j] <= Max_row[i][j]:
            Q1.pop()  # 保持单调性
        while Q2 and Min_row[Q2[-1]][j] >= Min_row[i][j]:
            Q2.pop()  # 保持单调性
        Q1.append(i); Q2.append(i)
        while Q1 and Q1[0] + n1 <= i:
            Q1.popleft() # 处理越界
        while Q2 and Q2[0] + n1 <= i:
            Q2.popleft() # 处理越界
        if i + 1 >= n1: # 保存答案
            Max[i - n1 + 1][j] = Max_row[Q1[0]][j]
            Min[i - n1 + 1][j] = Min_row[Q2[0]][j]

# 求解
ans = 0
for i0 in range(n - n1 + 1): # 枚举左上端点(i0, j0)
    for j0 in range(m - m1 + 1): # 右下端点(i0 + n1 - 1, j0 + m1 - 1)
        i = i0 + n1 - 1; j = j0 + m1 - 1
        fd = S[i + 1][j + 1] - S[i0][j + 1] - S[i + 1][j0] + S[i0][j0]
        gd = Max[i0][j0] - Min[i0][j0]
        ans = max(ans, fd * gd)
print(ans)

强者挑战赛

1-霓虹

dic = {
    '0' : "1111110",
    '1' : "0110000",
    '2' : "1101101",
    '3' : "1111001",
    '4' : "0110011",
    '5' : "1011011",
    '6' : "1011111",
    '7' : "1110000",
    '8' : "1111111",
    '9' : "1111011"
}

S = input(); T = input()
ans = 0
for i in range(len(S)):
    num1 = dic.get(S[i]); num2 = dic.get(T[i])
    for j in range(7):
        if num1[j] != num2[j]:
            ans += 1
print(ans)

2-兽之泪

from queue import PriorityQueue

k, n = map(int, input().split())
x = [0] * (k + 1); y = [0] * (k + 1)
S = 0; Min1 = pow(10, 9) # S 记录 x 数组的和 Min 记录 y 数组的最小值
for i in range(1, k + 1):
    x[i], y[i] = map(int, input().split())
    S += x[i]; Min1 = min(Min1, y[i])

# 情况1:打最后一只怪兽
ans2 = S + (n - k) * Min1

# 情况2:不打最后一只怪兽
ans1 = 0; Q = PriorityQueue(); Min2 = pow(10, 9)
for i in range(1, k): # 不要最后一只
    Q.put((x[i], i)); Min2 = min(Min2, y[i])
for i in range(n, 0, -1):
    score, idx = Q.get()
    if score == Min2: # 从这之后一直选择 idx
        ans1 += score * i
        break
    ans1 += score
    Q.put((y[idx], idx))

print(ans1 if n < k else min(ans1, ans2))

3-矩阵X

from collections import deque

# 读入数据
n, m, n1, m1 = map(int, input().split())
lst = [[0] * m for _ in range(n)]
for i in range(n):
    temp = list(map(int, input().split()))
    for j in range(m):
        lst[i][j] = temp[j]

# 二维前缀和:求子矩阵的和 O(1)
S = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(1, m + 1):
        S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + lst[i - 1][j - 1]

# 二维单调队列:求子矩阵的最值 O(1)
# 1.先求出每行的(窗口为 m1)最大值和最小值
Max_row = [[0] * (m - m1 + 1) for _ in range(n)]
Min_row = [[0] * (m - m1 + 1) for _ in range(n)]
for i in range(n): # 针对每一行 lst[i]
    Q1 = deque(); Q2 = deque() # Q1 最大值单调递减 Q2 最小值单调递增
    for j in range(m):
        while Q1 and lst[i][Q1[-1]] <= lst[i][j]:
            Q1.pop() # 保持单调性
        while Q2 and lst[i][Q2[-1]] >= lst[i][j]:
            Q2.pop() # 保持单调性
        Q1.append(j); Q2.append(j)
        while Q1 and Q1[0] + m1 <= j:
            Q1.popleft() # 处理越界
        while Q2 and Q2[0] + m1 <= j:
            Q2.popleft() # 处理越界
        if j + 1 >= m1: # 保存答案
            Max_row[i][j - m1 + 1] = lst[i][Q1[0]]
            Min_row[i][j - m1 + 1] = lst[i][Q2[0]]
# 2.求出 Max_row 每一列(窗口为 n1)最大值 Max_row 每一列(窗口为 n1)最小值
Max = [[0] * (m -m1 + 1) for _ in range(n - n1 + 1)]
Min = [[0] * (m -m1 + 1) for _ in range(n - n1 + 1)]
for j in range(m -m1 + 1): # 针对 Max_row[][j]、Min_row[][j] 的每一列
    Q1 = deque(); Q2 = deque() # Q1 最大值单调递减 Q2 最小值单调递增
    for i in range(n):
        while Q1 and Max_row[Q1[-1]][j] <= Max_row[i][j]:
            Q1.pop()  # 保持单调性
        while Q2 and Min_row[Q2[-1]][j] >= Min_row[i][j]:
            Q2.pop()  # 保持单调性
        Q1.append(i); Q2.append(i)
        while Q1 and Q1[0] + n1 <= i:
            Q1.popleft() # 处理越界
        while Q2 and Q2[0] + n1 <= i:
            Q2.popleft() # 处理越界
        if i + 1 >= n1: # 保存答案
            Max[i - n1 + 1][j] = Max_row[Q1[0]][j]
            Min[i - n1 + 1][j] = Min_row[Q2[0]][j]

# 求解
ans = 0
for i0 in range(n - n1 + 1): # 枚举左上端点(i0, j0)
    for j0 in range(m - m1 + 1): # 右下端点(i0 + n1 - 1, j0 + m1 - 1)
        i = i0 + n1 - 1; j = j0 + m1 - 1
        fd = S[i + 1][j + 1] - S[i0][j + 1] - S[i + 1][j0] + S[i0][j0]
        gd = Max[i0][j0] - Min[i0][j0]
        ans = max(ans, fd * gd)
print(ans)

4-独特的串

5-食堂

6-打折

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胆怯与勇敢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值