两道构造法求解的题及其扩展分析
题1:取 k 个不同的两位数,使得其中任意 3 个数做边长都无法构成三角形,求 k 的最大值。
【此题由walls老师提供的一道小学奥数题经略加改变而来】
分析:扩展到一般的情形,有:
从区间 [u, v](u 和 v 为正整数,且 v ≥ 2u+1)取 k 个不同整数,使得其中任意 3 个数做边长都无法构成三角形,求 k 的最大值。
最小和构造算法:构造有限数列 {ak},取 a1 = u, a2 = u+1, 从第3个数起,其取值为前两个数的和,出现和大于 v 时就停止。
即 a3 = 2u+1, a4 = 3u+2, ...,如此继续,直到出现某次的和大于 v,比如 am = am-2 + am-1 > v,则所求 k 的最大值为 m-1。
证明:
假设存在另一组数,个数大于m-1,且满足题设要求,把这组数按由小到大顺序排列为b1, b2, ..., bt, t ≥ m
由 a1 和 a2 的选取易知,a1 ≤ b1 和 a2 ≤ b2
在数列 {am-1} 和 {bt} 中,从左至右任取三个数 x < y < z,由题设要求可知,必有 x + y ≤ z。
特别地, {am-1} 和 {bt} 中任意三个相邻的数同样会满足左边两个数的和不大于右边的数。结合数列 {am-1} 的构造法易知
ai ≤ bi, i = 3,...,m-1
于是 v ≥ bm ≥ bm-2 + bm-1 ≥ am-2 + am-1 > v,矛盾。故上述的最小和构造算法求出的 m-1 就是所求 k 的最大值。
解:利用上述最小和构造算法,有
a1 = 10, a2 = 11, a3 = 10+11 = 21, a4 = 11+21 = 32, a5 = 21+32 = 53, a6 = 32+53 = 85, a7 = 53+85 > 99
故所求 k 的最大值为 6。
题2:Each tile on an n × n grid gets "infected" if at least two of its four neighbours are infected. How many infected squares are required initially, so that the pandemic can spread across the entire grid?
【此题是从一位做个性化教育的微信好友的朋友圈里看到的】
中文解释:在上图所示的 n × n 方格矩阵中,如果某个方格的四个相邻方格中至少有两个已感染,则该方格也会被感染。请问最初需要设置多少个已感染的方格,就能确保把全盘的方格全部感染?
题意分析:从给的图示看,所谓四个相邻方格是指上下左右四个邻格,实际上并不是所有的方格都有 4 个邻格,4个边角位置的方格只有两个邻格,其它贴边的方格只有三个邻格。
解:用 F(m,n) 来表示 m × n(m 行 n 列)的方格矩阵中最小已感染方格的数目,即最初一定可以设置一种 F(m,n) 个方格已感染的可行实例,基于上面的传染规则可以把所有其它的方格都感染为病例,且最初如果只设置F(m,n) - 1 个方格已感染的话,则无法基于上面的传染规则把所有其它的方格都感染为病例。
考虑 1 × 1 方阵,显然有 F(1,1) = 1
考虑 2 × 2 方阵,初始病例数为 1 显然是不行的,即有 F(2,2) ≥ 2,进一步尝试容易发现,初始病例处于对角线上的两个方格是可行的,比如:
a11 a12
a21 a22
于是有 F(2,2) = 2
考虑 3 × 3 方阵,如下所示:
a11 a12 a13
a21 a22 a23
a31 a32 a33
要使得左上角 2 × 2 的子方阵全体感染,需要预设其中 F(2,2) = 2 个方格为病例,且如果不增加新的预设病例方格,无法感染 3 × 3 方阵中最右列和最尾行上的方格,即有 F(3,3) ≥ 3
现在增加一个预设病例方格 a33,如下所示:
a11 a12 a13
a21 a22 a23
a31 a32 a33
从下往上考察最右列,由上述传染规则可知 a23 和 a13 依次会被感染;同样,从右往左考察最尾行,可知 a32 和 a31 依次会被感染,至此整个 3 × 3 方阵都被感染,故有 F(3,3) = 3
进一步沿着对角线增加预设病例方块,可以直观地发现 F(n,n) = n
以下尝试用数学归纳法证明这个结论:
假设 F(k,k) = k 成立,即对于 k × k 方阵,可由对角线上预设的 k 个病例方格(即 a11, a22, ..., akk)基于题设规则把整个 k × k 方阵感染,考虑如下所示的 (k+1) × (k+1) 方阵:
a11 a12 ... a1k a1(k+1)
a21 a22 ... a2k a2(k+1)
...
ak1 ak2 ... akk ak(k+1)
a(k+1)1 a(k+2)2 ... a(k+1)k a(k+1)(k+1)
(k+1) × (k+1) 方阵可看成由左上角的 k × k 方阵增加第 k+1 列和第 k+1 行 组成,如果仅预设a11, a22, ..., akk 这 k 个病例方格(或其它可行的 左上角 k × k 方阵内的任意 k 个预设病例方格),由假设可知只能把左上角的 k × k 个方格全部感染为病例,而最右列和最尾行上的方格因为邻块数小于 2 而不会被感染,于是有 F(k+1, k+1) ≥ k+1
现在增加一个预设病例方格 a(k+1)(k+1),从下往上考察最右列,由上述传染规则可知 ak(k+1) 、a(k-1)(k+1)、...、a1(k+1) 依次会被感染;同样,从右往左考察最尾行,可知该行的方格依次会被感染,至此整个 (k+1) × (k+1) 方阵都被感染,故有 F(k+1,k+1) = k+1
综上有 F(n,n) = n。
题2的一些扩展命题探索:
1、对于 n × n 方阵,预设的 n 个感染方格只能部署在对角线位置上吗?
不是的,比如 3 × 3 方阵可以这样放置预设病例方格:
a11 a12 a13
a21 a22 a23
a31 a32 a33
还可以这样:
a11 a12 a13
a21 a22 a23
a31 a32 a33
n 越大,可组合的预设病例方格的可行实例种数就越多。
2、对于更一般的 m × n 矩阵,F(m,n) 是否有统一的表达式?
以下是一些探索结果,不作特别详细的说明和证明了:
由对称性易知,F(m,n) = F(n,m),以下只需考虑 m < n 的情形
考察 m = 1 的情形,可知 F(1, 2n) = F(1, 2n+1) = n+1,统一起来有 F(1,n) = [n/2] + 1
由 F(1,2) = 2, F(1,3) = 2,不禁会怀疑上面证明 F(n,n) = n 的严谨性,1 × 2 矩阵里只有两个方格,所以两个都必须置为预设病例;而到了 1 × 3 矩阵,等于是说从左边的 1 × 2 矩阵里拿掉了一个预设病例方格(必需是右边那格)而由新增的方格接替为预设病例。上面的证明里应该排除掉这种可能性才是完备的,改进的方向有两方面:
(1)证明 k × k 方阵的全体预设病例的可行实例是等价的,可以经过一些等价变换相互转化
这样就可以只考虑对角线形式的可行实例
(2)由左上角的 k × k 方阵扩展到 (k+1) × (k+1) 方阵时,新增为预置病例的方格只能为 a(k+1)(k+1) ,此时若从 a11, a22, ..., akk 中去掉一个预置病例,则无法使得整个 (k+1) × (k+1) 方阵都被感染
考察 m = 2 的情形,可知 F(2,2n-1) = F(2,2n) = n+1,统一起来有 F(2,n) = [(n+1)/2] + 1
进一步考察,有
F(3,n) = [n/2] + 2
F(4, n) = [(n+1)/2] + 2
...
综合上述 F(1,n)、F(2,n)、F(3,n)、F(4,n) 的表达式,可以发现 F(m,n) = [(m+n+1)/2]。
当 m = n 时,即有 F(n,n) = [(n+n+1)/2] = [n+1/2] = n。