Codility题解之MaxNotPresent

Codility challenge: Germanium 2018

题目地址 https://app.codility.com/programmers/task/max_not_present/

桌子上有N张卡片,每个卡片正反面都有一个正整数,可以随意翻转卡片,使得最小的没有出现在卡片上方的数字最大。

首先,结果一定会小于等于N+1,所以大于N的数字不用考虑。解法用到了并查集和树的知识。如果一张卡片两面的数字是a和b,那么在a和b之间连一条边。代码见 https://blog.csdn.net/kidgin7439/article/details/81535229 和 https://stackoverflow.com/questions/52100461

有一个地方需要解释一下,即一个没有环的子图(树)可以做到除一个数字外,所有数字都朝上。证明如下:将树里面最大的节点(或任意节点)向上提起,使其变成有根树。对于每条边(也就是每张卡片),选择边下方的那个数字面朝上,这样除了树根,每个数字都面朝上,如下图所示。同样的,对于有环的图,选择环中任意一个节点作为树根,由于多了一条指回树根的边,所以可以做到所有的数字都朝上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值