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