这是一个经典的容斥原理应用题。
设三个集合分别为 $A$(新手)、$B$(算法入门)、$C$(算法进阶)。
已知 $n = |A \cup B \cup C|$ (至少刷过一个的总人数) $a = |A|, b = |B|, c = |C|$ (各题单人数) $d$: 恰好刷过两个题单的人数。 设 $x$: 同时刷过三个题单的人数(我们要找的解)。
-
根据容斥原理:
$$|A \cup B \cup C| = |A| + |B| + |C| - (|A \cap B| + |A \cap C| + |B \cap C|) + |A \cap B \cap C|$$其中,任意两个集合的交集(如 $|A \cap B|$)包含了“恰好刷过两个”的人和“刷过全部三个”的人。 因此:$|A \cap B| + |A \cap C| + |B \cap C| = d + 3x$(因为 $x$ 这部分人在三个两两交集中各被算了一次)。
代入公式:
$$n = a + b + c - (d + 3x) + x$$
$$n = a + b + c - d - 2x$$得出 $x$:
$$2x = a + b + c - n - d$$
$$x = \frac{a + b + c - n - d}{2}$$
流程图

代码实现
|
|