Acwing 周赛142 解题报告 | 珂学家 | BFS集合

本文介绍了编程竞赛中的三个题目,涉及模拟算法、思维技巧、计数器应用以及图论中的BFS方法,讨论了如何评估字符串问题的得分和有效点对的计算策略。
摘要由CSDN通过智能技术生成

前言


整体评价

VP了这场比赛,感觉T2挺有意思的,超级容易错,T3到时中规中矩,算Middle更合适。


A. 倒序排列

思路: 模拟

n = int(input())

l = [i for i in range(n, 0, -1)]

print (*l, sep=' ')

B. 最有价值字符串

思路: 思维

这题难在思维,容易错

这边有两个小难点

  • 如何评估得分

    • 分情况讨论

      • 最大频数非唯一
      • 所有数都相等
  • 最后结果判定

    • n-largest的方式
n = int(input())

a, b, c = input(), input(), input()

from collections import Counter

def evalute(s) -> int:
    cnt = Counter(s)
    t1 = max(cnt.values())
    t2 = len(s) - t1
    if t2 > 0:
        return t1 + min(t2, n)
    else:
        return t1 - (1 if n == 1 else 0)

# 模拟n-largest操作
l = [(evalute(a), 'A'), (evalute(b), 'B'), (evalute(c), 'C')]
l.sort(key=lambda x: -x[0])

# 判定第一个元素和第二个元素,值是否相等
if l[0][0] > l[1][0]:
    print (l[0][1])
else:
    print ('D')

C. 有效点对

思路: 两次bfs+容斥

分别从x,y两点出发做bfs,然后进行染色A,B

比如从x点出发,止于y这个阻塞点,其他点全遍历为s1,则y这个阻塞点覆盖点集 A = n - s1

反之亦然 B = n - s2

最后结果为

n ∗ ( n − 1 ) − A ∗ B n*(n-1) - A*B n(n1)AB

n, x, y = list(map(int, input().split()))

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

for i in range(n - 1):
    u, v = list(map(int, input().split()))
    g[u].append(v)
    g[v].append(u)
    

from collections import deque

def bfs(u, v):
    vis = [1] * (n + 1)
    vis[0] = 0
    deq = deque()
    deq.append(u)
    vis[u] = 0
    while len(deq) > 0:
        cur = deq.popleft()
        for ver in g[cur]:
            if vis[ver] == 1 and ver != v:
                deq.append(ver)
                vis[ver] = 0
    return sum(vis)

c1, c2 = bfs(x, y), bfs(y, x)

print (n * (n - 1) - c1 * c2)

写在最后

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值