题意:
给 n n n个数,让你构造一个尽可能大的矩阵,其中每个点所在的行和列都不含相等元素。
思路:
假设构造的答案矩阵大小为 a × b a×b a×b且 a < = b a<=b a<=b,那么我们可以知道其中最大的相等元素的个数一定 < = a <=a <=a,否则一定不能保证每行每列都不相等。
那么我们就可以 [ 1 , n ] [1,n] [1,n]枚举最大的出现次数即 a a a,让后假设选出的元素个数为 t o t tot tot,那么 b = ⌊ t o t a ⌋ b=\left \lfloor \frac{tot}{a} \right \rfloor b=⌊atot⌋,让后取一个最大的就行了。
现在知道矩阵大小 a × b a×b a×b了,下面考虑怎么构造答案。
这里直接盗了题解的图了,顺便先把构造方法说了。假设当前位置在 ( x , y ) (x,y) (x,y),那么下一个位置就是 ( ( x + 1 ) m o d a , ( y + 1 ) m o d b ) ((x+1)\bmod a,(y+1)\bmod b) ((x+1)moda,(y+1)modb),当然如果 a ∗ a a*a a∗a的矩阵的话,这样写会一直在主对角线上跑,我们特判一下当前位是否填过了,如果填过的话就 x = ( x + 1 ) m o d a x=(x+1)\bmod a x=(x+1)moda即可。
其实一开始想到了这样按照斜着填,但是不知道怎么走才能保证自己的想法能实现出来。
题解 ( ( x + 1 ) m o d a , ( y + 1 ) m o d b ) ((x+1)\bmod a,(y+1)\bmod b) ((x+1)moda,(y+1)modb)这样很巧妙,如下面 4 × 6 4×6 4×6的矩阵,填完 5 , 6 5,6 5,6再填 7 , 8 7,8 7,8的时候正好保证了这四个元素在不同的行。可以证明每个点所在的行和列都不含相等元素。