题意:
给 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的时候正好保证了这四个元素在不同的行。可以证明每个点所在的行和列都不含相等元素。