蓝桥杯2024年第十五届省赛 python B组 题解

C - 连连看

n, m = map(int, input().split())
a = []
for i in range(n):
    a += [list(map(int, input().split()))]

ans = 0

b = [{} for _ in range(n + m)]

for i in range(n):
    for j in range(m):
        if a[i][j] not in b[i + j]:
            b[i + j][a[i][j]] = 0
        b[i + j][a[i][j]] += 1

for k in range(n + m):
    for key, value in b[k].items():
        if value > 1:
            ans += value * (value - 1)
    
b = [{} for _ in range(n + m)]
for i in range(n):
    for j in range(m):
        if a[i][j] not in b[i - j]:
            b[i - j][a[i][j]] = 0
        b[i - j][a[i][j]] += 1

for k in range(n + m):
    for key, value in b[k].items():
        if value > 1:
            ans += value * (value - 1)
  
print (ans)

D - 回文数组

from datetime import *

start = datetime(1970, 1, 1, 0, 0, 0)

T = int(input())
for _ in range(T):
    date, time, x = input().split()
    now_time = datetime.strptime(date + ' ' + time, "%Y-%m-%d %H:%M:%S")
    x =  timedelta(minutes=int(x))
    print(now_time - (now_time - start) % x)

E - 蓝桥村的真相

T = int(input())
for _ in range(T):
    n = int(input())
    if n % 3 == 0:
        print(n * 2)
    else:
        print(n)

G - 缴纳过路费

n, m, l, r = map(int, input().split())

a = [[] for _ in range(n + 1)]

edges = []

for i in range(m):
    u, v, w = map(int, input().split())
    if l <= w <= r:
        edges.append((v, u, w))

fa = [i for i in range(n + 1)]
siz = [1 for i in range(n + 1)]

def find(x):
    if fa[x] != x:
        fa[x] = find(fa[x])
    return fa[x]

def merge(x, y):
    x, y = find(x), find(y)
    if x == y:
        return
    fa[x] = y
    siz[y] += siz[x]
    siz[x] = 0

ans = 0

sorted_edges = sorted(edges, key=lambda x: x[2])
for u, v, w in sorted_edges:
    if find(u) == find(v):
        continue
    ans += siz[find(u)] * siz[find(v)]
    merge(u, v)

print(ans)