牛客练习赛93 题解
啊啊啊啊,多给一些牛币吧,想给女朋友换衣服做圣诞礼物QAQ
A. 排队
Solution
根据题意和样例,发现可以一遍走路一遍掏手机打开健康码,所以不难分析出答案是 。
Code
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=49890331
B.斗地主
Solution
经典dp问题,由于 , 我们可以用 表示第 轮时,当前积分在模 后为 的方案数。 显然对于初始状态有 ,对于每次转移都可以枚举手头有哪些牌可以出,所以转移式子是:
Code
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=49890376
C.点权
Solution
依据题意,我们知道在一颗树上满足条件1的都是叶子,所以其实可以从叶子节点开始扩展,有点类似于拓扑排序: 先建立一个队列,然后把叶子节点丢进去,如果有一个非叶子节点已经被两个叶子节点连通,就把它丢进队列里(因为它现在权值也是2了)。
由于一个节点扩展后变成-1,相当于被删除了,所以以上做法是能算出可行解的。但是这个做法有一个问题就是无法保证答案是最小的。
于是考虑将队列换成优先队列,类似于堆优化 Dijkstra 的思想,如果当前节点的权值被松弛了,那么它就应该继续被丢到优先队列里继续扩展它的相邻节点。
实现上我们需要维护两个值:最小值 和次小值,当 的值变小时,说明答案可能会更小,应该放进优先队列里让它继续松弛。
时间复杂度:
Code
https://ac.nowcoder.com/acm/contest/view-submission?submissionId=49891503
D. 牛牛玩 generals
Soltuion
显然是一道数据结构题,由于出现了捕食关系,考虑用并查集维护这一关系。因为区间只有 ,所以如果将区间用多个线段去表示的话,最多不会超过 个(最坏情况每个线段长度都为1),所以在空间复杂度上是可行的。
随后需要考虑对于每个线段会有合并,分裂,删除的操作,这些操作都可以用 set 每次 的时间去维护。 在模拟的时候需要注意一些细节,比如 set 的迭代器的值要在删除前取出来,再想清楚以下三种情况即可。
Code
E. 牛牛选路径
Solution
这个题跟欧拉回路的分析方法类似。
首先我们知道:如果能构造一条欧拉回路的话,只需要选取某个权值最小的点,代价是 。
那么什么时候构造不出欧拉回路呢?如果你稍微画几个图就会发现:有大于等于4个奇数度数的顶点,你怎么连都不能构成欧拉回路。
因为欧拉回路的要求是最多两个奇数度顶点,剩余全是偶数度。 又因为是无向图,度数总值一定是偶数(入度和出度总是成对出现),所以奇数度顶点的数量一定是偶数的。所以我们可以把奇数度的点两两配对,局部形成欧拉回路。那么问题就转换成了给你 个数字,满足 为偶数,让他们两两配对,求 的最小值。显然做法是拿最小的去配对最大的,次小的配对次大的......
Code
一些比赛的题解