来到 JLU 后学到的一些东西

2020-12-17 链环转换

断环为链

2020-12-08 思考题

比赛链接

题目并不是很难,但是由于我过于SB,对题面理解有误,想了老半天都想不出来,看了题解还觉得不对,但是实际上题解很真理。总之我就一SB。

题目简述

给出一个大小为 N × N N\times N N×N 的棋盘,以及棋盘的初始状态,要求反转不超过 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor 3k 个棋子( k k k 为棋子的总个数),使得修改后的棋盘符合“非终止”定义。输出一种符合要求的修改方案,如果有多种合法方案,任意输出一种方案即可。

我们用 A i , j   ( 1 ≤ i , j ≤ N ) A_{i,j}\space(1\leq i, j\leq N) Ai,j (1i,jN) 表示中第 i i i 行、第 j j j 列的状态:

  1. A i , j = ’.’ A_{i, j}=\text{'.'} Ai,j=’.’ 表示该位置没有棋子,没有棋子的位置不允许进行状态反转的操作。
  2. A i , j = ’X’ A_{i, j}=\text{'X'} Ai,j=’X’ 表示该位置有棋子,棋子类型为 ’X’ \text{'X'} ’X’,反转后棋子类型为 ’O’ \text{'O'} ’O’
  3. A i , j = ’O’ A_{i, j}=\text{'O'} Ai,j=’O’ 表示该位置有棋子,棋子类型为 ’O’ \text{'O'} ’O’,反转后棋子类型为 ’X’ \text{'X'} ’X’

终止的定义是,棋盘上存在同种棋子的 “横三连” 或者 “竖三联”,形式化的表述为:

∃ i , j ∈ N , 1 ≤ i , j ≤ N \exist i,j \in \N,1\leq i, j\leq N i,jN,1i,jN 使得 A i , j = A i + 1 , j = A i + 2 , j ≠ ’.’ A_{i, j}=A_{i+1, j}=A_{i+2, j}\not=\text{'.'} Ai,j=Ai+1,j=Ai+2,j=’.’ 或者 A i , j = A i , j + 1 = A i , j + 2 ≠ ’.’ A_{i, j}=A_{i, j+1}=A_{i, j+2}\not = \text{'.'} Ai,j=Ai,j+1=Ai,j+2=’.’

如果一种棋盘状态不满足终止的定义,那么我们就称它 非终止

有解性证明

接下来的内容中,我们将要证明:至少存在一种反转次数不超过 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor 3k 个棋子的方案,使得操作后的棋盘状态非终止。

定义:对棋盘上的每一个位置分类

我们在棋盘的每一个格子上写一个数字,我们第 i i i 行 第 j j j 列的格子上,我们写上数字 ( i + j ) m o d    3 (i+j) \mod 3 (i+j)mod3。此后,被写了相同数字的格子被划分到同一类中,这样我们就得到三类格子。

第一类格子的坐标的集合为 S 0 = { ( i , j ) : i , j ∈ N , 1 ≤ i , j ≤ N 且 ( i + j ) m o d    3 = 0 } S_0 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 0\} S0={(i,j):i,jN,1i,jN(i+j)mod3=0}
第二类格子的坐标的集合为 S 1 = { ( i , j ) : i , j ∈ N , 1 ≤ i , j ≤ N 且 ( i + j ) m o d    3 = 1 } S_1 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 1\} S1={(i,j):i,jN,1i,jN(i+j)mod3=1}
第三类格子的坐标的集合为 S 2 = { ( i , j ) : i , j ∈ N , 1 ≤ i , j ≤ N 且 ( i + j ) m o d    3 = 2 } S_2 = \{(i, j): i, j \in \N, 1\leq i, j\leq N 且 (i+j)\mod 3 = 2\} S2={(i,j):i,jN,1i,jN(i+j)mod3=2}

为了表述方便,如果 ( i , j ) ∈ S x (i, j)\in S_x (i,j)Sx,我们称位置 ( i , j ) (i, j) (i,j) 隶属于分类 S x S_x Sx,称 ( i , j ) (i, j) (i,j)类编号 x x x(其中 x = ( i + j ) m o d    3 x=(i+j)\mod 3 x=(i+j)mod3)。

5 × 5 5\times 5 5×5 的棋盘,类型划分如下:

+--+--+--+--+--+
| 2| 0| 1| 2| 0|
+--+--+--+--+--+
| 0| 1| 2| 0| 1|
+--+--+--+--+--+
| 1| 2| 0| 1| 2|
+--+--+--+--+--+
| 2| 0| 1| 2| 0|
+--+--+--+--+--+
| 0| 1| 2| 0| 1|
+--+--+--+--+--+
引理:“一类定全局”

不难说明,若 ∃ x ∈ { 0 , 1 , 2 } \exist x \in \{0, 1, 2\} x{0,1,2} 使得 ∀ ( i , j ) ∈ S x \forall (i,j)\in S_x (i,j)Sx A i , j ̸ = ′ X ′ A_{i, j}\not ='X' Ai,j=X,则棋盘上棋子 ’X’ \text{'X'} ’X’既不存在“横三连”,也不存在“竖三联”,形式化表述为:

∀ i , j ∈ { 1 , 2 , ⋯   , n } , A i , j = ’X’ , A i , j + 1 = ’X’ , A i , j + 2 = ’X’ \forall i, j\in \{1,2,\cdots,n\}, A_{i, j}=\text{'X'}, A_{i, j+1}=\text{'X'},A_{i, j+2}=\text{'X'} i,j{1,2,,n},Ai,j=’X’,Ai,j+1=’X’,Ai,j+2=’X’ 不可能同时成立。

∀ i , j ∈ { 1 , 2 , ⋯   , n } , A i , j = ’X’ , A i + 1 , j = ’X’ , A i + 2 , j = ’X’ \forall i, j\in \{1,2,\cdots,n\}, A_{i, j}=\text{'X'}, A_{i+1, j}=\text{'X'},A_{i+2, j}=\text{'X'} i,j{1,2,,n},Ai,j=’X’,Ai+1,j=’X’,Ai+2,j=’X’ 也不可能同时成立。

这一点很好证明,无论如何选取 x x x,任意横相连或者竖相连的三个位置上,都至少有一个隶属于分类 S x S_x Sx,因为任意横相连或者竖相连相邻的三个位置,他们的的类编号 { ( i + j ) m o d    3 , ( i + j + 1 ) m o d    3 , ( i + j + 2 ) m o d    3 } \{(i+j)\mod 3, (i+j+1)\mod 3, (i+j+2) \mod 3\} {(i+j)mod3,(i+j+1)mod3,(i+j+2)mod3} 恰好取遍 0 , 1 , 2 {0, 1, 2} 0,1,2 三个值。

算法:“取两类格子各自清除一种棋子”

为了表述方便,我们定义了一个函数 C C C 用来统计某种分类的所有格子中,某种棋子的出现次数:

C ( v , ’X’ ) = ∑ ( i , j ) ∈ S v [ A i , j = ’X’ ] C(v, \text{'X'})=\sum_{(i, j)\in S_v} [A_{i, j}=\text{'X'}] C(v,’X’)=(i,j)Sv[Ai,j=’X’]

C ( v , ’O’ ) = ∑ ( i , j ) ∈ S v [ A i , j = ’O’ ] C(v, \text{'O'})=\sum_{(i, j)\in S_v} [A_{i, j}=\text{'O'}] C(v,’O’)=(i,j)Sv[Ai,j=’O’]

由于 S 0 ∪ S 1 ∪ S 2 S_0 \cup S_1 \cup S_2 S0S1S2 恰好覆盖整个棋盘,因此:

∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = k \sum_{v = 0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=k v=02(C(v,’X’)+C(v,’O’))=k

根据引理“一类定全局”,我们可以给出一种能够使棋盘成为“非终止状态”的操作方案。

  1. 选择一对整数 ( p , q ) (p, q) (p,q) 其中 p , q ∈ { 0 , 1 , 2 } p,q \in \{0, 1, 2\} p,q{0,1,2} p ≠ q p\not = q p=q
  2. 然后将位置集合 S p S_p Sp 中所有的 ’X’ \text{'X'} ’X’ 反转。此次操作后,棋盘上一定不存在三连 ’X’ \text{'X'} ’X’
  3. 最后将位置集合 S q S_q Sq 中所有的 ’O’ \text{'O'} ’O’ 反转。此次操作后,棋盘上一定不存在三连 ’O’ \text{'O'} ’O’

经历了这样的操作后,我们得到的棋盘状态一定是非终止状态

那么我们到底反转了多少个位置呢?是否能够证明,我们一定能找到一对 ( p , q ) (p,q) (p,q) 使得我们反转的位置的总数小于等于 ⌊ k 3 ⌋ \left\lfloor\frac{k}{3}\right\rfloor 3k 呢?

为了方便表述,我们再定义一个函数 S ( x , y ) S(x, y) S(x,y)

S ( x , y ) = C ( x , ’X’ ) + C ( y , ’O’ ) S(x, y) = C(x, \text{'X'}) + C(y, \text{'O'}) S(x,y)=C(x,’X’)+C(y,’O’)

不难发现,当 x ≠ y x\not = y x=y 时, S ( x , y ) S(x, y) S(x,y) 就是 p = x , q = y p=x, q=y p=x,q=y 时上述算法反转的格子的总数。

另外有:

S ( 0 , 0 ) + S ( 1 , 1 ) + S ( 2 , 2 ) = ∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = k S(0, 0) + S(1, 1) + S(2, 2)=\sum_{v = 0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=k S(0,0)+S(1,1)+S(2,2)=v=02(C(v,’X’)+C(v,’O’))=k

那么三分之一是怎么来的呢?

∑ i = 0 2 ∑ j = 0 2 S ( i , j ) = 3 × ∑ v = 0 2 ( C ( v , ’X’ ) + C ( v , ’O’ ) ) = 3 k \sum_{i=0}^2\sum_{j=0}^2S(i, j)=3 \times \sum_{v=0}^2(C(v, \text{'X'})+C(v, \text{'O'}))=3k i=02j=02S(i,j)=3×v=02(C(v,’X’)+C(v,’O’))=3k

我们给出的算法总共只有六种方案,考虑将这些方案的操作次数求总和。

S ( 0 , 1 ) + S ( 0 , 2 ) + S ( 1 , 0 ) + S ( 1 , 2 ) + S ( 2 , 0 ) + S ( 2 , 1 ) = ( ∑ i = 0 2 ∑ j = 0 2 S ( i , j ) ) − ( ∑ i = 0 2 S ( i , i ) ) = 3 k − k = 2 k S(0, 1)+S(0, 2) + S(1, 0) + S(1, 2) + S(2, 0) + S(2, 1)=\left(\sum_{i=0}^2\sum_{j=0}^2S(i, j)\right)-\left(\sum_{i = 0}^2S(i, i)\right) = 3k-k=2k S(0,1)+S(0,2)+S(1,0)+S(1,2)+S(2,0)+S(2,1)=(i=02j=02S(i,j))(i=02S(i,i))=3kk=2k

根据抽屉原理(6个数中的最小值一定小于等于这六个数的平均数),有:

min ⁡ { S ( 0 , 1 ) , S ( 0 , 2 ) , S ( 1 , 0 ) , S ( 1 , 2 ) , S ( 2 , 0 ) , S ( 2 , 1 ) } ≤ S ( 0 , 1 ) + S ( 0 , 2 ) + S ( 1 , 0 ) + S ( 1 , 2 ) + S ( 2 , 0 ) + S ( 2 , 1 ) 6 = 2 k 6 = k 3 \min\{S(0, 1) , S(0, 2) , S(1, 0) , S(1, 2) , S(2, 0) , S(2, 1)\}\leq \frac{S(0, 1)+S(0, 2) + S(1, 0) + S(1, 2) + S(2, 0) + S(2, 1)}{6} = \frac{2k}{6}=\frac{k}{3} min{S(0,1),S(0,2),S(1,0),S(1,2),S(2,0),S(2,1)}6S(0,1)+S(0,2)+S(1,0)+S(1,2)+S(2,0)+S(2,1)=62k=3k

也就是说,我们找到六种方案中,反转次数最少的方案反转,其反转次数一定小于等于 k 3 \frac{k}{3} 3k。而反转次数一定是整数,因此反转次数一定 ≤ ⌊ k 3 ⌋ \leq \left\lfloor\frac{k}{3}\right\rfloor 3k

Q . E . D . Q.E.D. Q.E.D.

与上面这道题相似

HJQ 大佬还教了我一到关于扫雷的题目,

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值