C 109 97字节和正确性证明
我正在编写解决方案,但@steveverrill击败了我。我以为我会完全一样,因为我提供了所用策略的正确性证明。
简化代码:
m,n,x;main(){for(scanf("%i%i",&m,&n); n;)putchar(x<m?"# "[x%2*(++x^m||~n&1)&&n^1]:(x=0,n--,10));}
还原前:
m,n,x;
main(){
for(scanf("%i%i",&m,&n); n;)
/* If x == m, prints out a newline, and iterates outer
* loop (x=0,n--) using comma operator.
* Otherwise, paints a '#' on :
* Every even column (when x%2 is 0)
* On odd columns of the last row (++x^m||~n&1 is 0)
* On the first row (when n^1 is 0)
* And a ' ' on anything else (when predicate is 1) */
putchar(x<m?"# "[x%2*(++x^m||~n&1)&&n^1]:(x=0,n--,10));
}
策略与证明:
假定最大准直器方程(M + 1)(N + 1)-((M + 1)(N + 1))mod 2的正确性,以下解释了所使用的最佳策略并通过归纳证明其正确性:
对于奇数M,我们用M / 2 + 1个手指画一个手形,例如:
3x2
# #
###
5x3
# # #
# # #
#####
现在我们通过归纳证明,该策略对于所有奇数M都是最佳的:
基本情况: M = N = 1
单个单元格已填充。该解决方案是正确的,因为(1 +1)*(1 +1)= 2 * 2 = 4,并且一个正方形有4个边。
宽度归纳法:
假设手形策略适用于(N,M-2),其中M为奇数,即其准直器为最佳且为(N + 1)(M-2 + 1)+((M -1)(N + 1))mod 2。现在我们显示它适用于(N,M)。
添加手指的过程从多边形中删除了一条边,并添加了3 + 2N。例如:
5x3 -> 7x3
# # # $
# # # $
#####$$
结合我们先前的周界是最佳假设的假设,新周界为:
(N + 1)*(M - 2 + 1) - ((M+1)*(N+1)) mod 2 - 1 + 3 + 2*N
(N + 1)*(M + 1) - ((M-1)*(N+1)) mod 2 - 2(N + 1) - 1 + 3 + 2*N
(N + 1)*(M + 1) - ((M-1)*(N+1)) mod 2
由于我们正在处理模2算术,
((M-1)*(N+1)) mod 2 = ((M+1)*(N+1)) mod 2
因此,证明通过增加手指来增加宽度导致最佳的周长。
高度感应:
假设手形策略适用于(N-1,M),其中M为奇数,即其周长为最佳,且为N(M +1)+((M + 1)N)mod 2。现在我们显示它适用于(N,M)。
增加手的高度只会使位于第一个x索引和每个其他x索引的手指拉长。对于每个高度增加,每个手指在周长上增加两个,并且有(M + 1)/ 2个手指,因此,N的增加导致2(M + 1)/ 2 = M + 1的增加的增加。周长。
将其与假设相结合,我们得到的新范围是:
N*(M + 1) + ((M+1)*N) mod 2 + M + 1
(N + 1)*(M + 1) + ((M+1)*N) mod 2
模块化算术使我们能够简化最后一项,从而获得:
(N + 1)*(M + 1) + ((M+1)*(N+1)) mod 2
证明该解对于所有N> 0和奇数M> 0都是最优的。
对于偶数M,我们用与奇数M相同的方式填充木板,但是我们在最后一个段中添加了锯齿状,例如:
4x3
# ##
# #
####
6x4
# # #
# # ##
# # #
######
现在我们证明该策略是最佳的。
偶数M的归纳法:
假设解对(N,M-1)是正确的,且奇数M-1(在最后一种情况中得到证明),其最佳周长为(N +1)M-( M(N + 1))mod 2。现在我们显示它适用于(N,M)。
像增加手指一样,每个锯齿状添加两个到多边形的周长。锯齿状的总数为(N + N mod 2)/ 2,总共增加了N + N mod 2的周长。
将其与假设相结合,我们得到的新范围是:
(N + 1)*M - (M*(N+1)) mod 2 + N + N mod 2
(N + 1)*(M + 1) - (M*(N+1)) mod 2 + N mod 2 - 1
(N + 1)*(M + 1) - (M*(N+1)) mod 2 - (N + 1) mod 2
我们有
(M*(N+1)) mod 2 - (N + 1) mod 2 = ((M+1)*(N+1)) mod 2
因为如果N为奇数,则减为0 = 0,如果N为偶数,则减为
- A mod 2 - 1 = -(A + 1) mod 2
因此,该策略对于所有M,N> 0都是最佳的。