关于三角形
只需小学 \(2\) 年级的水平就可以看懂。
引入
给定一个序列 \(a_1 \sim a_n(1 \le a_i \le 10^9)\),查询能否选 \(3\) 个不同的数,使得这三个数的值能组成三角形。
结论:若 \(n \ge 45\),必有解。
证明:设三个数为 \(A \le B \le C\),若它们不能组成三角形,有 \(C \ge A + B\)。
那么将数组 \(a\) 排序后,若无解,则有 \(a_i \ge a_{i - 1} + a_{i - 2}(i \ge 3)\),那么 \(a_i \ge f_i\),\(f\) 为斐波那契数列。
因为 \(a_i \le 10^9, f_{45} = 11,3490,3170(f_1 = f_2 = 1)\),所以 \(n \ge 45\) 必有解。
总之,若 \(n \ge p\),\(f_p > V\),则必有解。
进阶
若要选出 \(3(k + 1)\) 个不同的数,组成 \(k + 1\) 个三角形呢?
结论: \(n \ge p + 3k\) 必有解。
证明:考虑归纳
对于 \(k = 0\),成立。
若对于 \(k = x\) 成立,下面证明 \(k = x + 1\) 成立
\(n \ge p + 3(k + 1) > p + 3\),可知一定可以找到一个三个数凑出一个三角形,去掉这三个数,剩余至少有 \(p + 3k\),有归纳假设可以凑出 \(k\) 个三角形,共 \(k + 1\) 个。
所以对于 \(n\) 较大时,直接输出 Yes 跑路即可。否则解暴力吧。
但是暴力也是又讲究的。将 \(a\) 排序后,不难发现三个数靠的越紧,越容易组成三角形。
所以组成三角形的三个数肯定挨在一起。除非很多个三角形混在一起,如 \([{\color{red}{3}} \ 4 \ {\color{red}{8 \ 8}} \ 9 \ 12 ]\)。
浙公网安备 33010602011771号