1
在 nn 的网格上,由边界某个格子出发四连通经过所有格子一次且仅一次再回到边界上,要求拐弯次数至少有 n(n-1)-1 次。
看起来无从下手。不知从何下手的题目一般有两种解决办法:
1.考虑能否 缩小范围,递归处理。
2.
这道题显然是第一种。因为我们可以沿着左边缘和下边缘两列走一圈,递归套用 n-2 的构造方案。
这道题目启发我们,很多时候 递归构造 是一个不错的选择。
2
给定一个度数序列,询问是否存在一个简单图满足这个序列。
构造方法:按度数从大到小排序,贪心地向最大的若干个点连边。
有解当且仅当:
∑
i
=
1
k
d
i
<
=
k
(
k
−
1
)
+
∑
j
=
k
+
1
n
m
i
n
(
d
j
,
k
)
\sum_{i=1}^k d_i<=k(k-1)+\sum_{j=k+1}^nmin(d_j,k)
i=1∑kdi<=k(k−1)+j=k+1∑nmin(dj,k)
3
考虑一个贪心:从低向高摆放,每次选择最多的颜色填最后一行。但是这样其实是不对的。比如 1,4,5。
那怎么办呢?注意到当 n 较大(>3)时,最多的颜色肯定大于等于当前要放的数量,问题在于有时候有多种选择。这时候我们称这一行为可选择的,先随便放一种颜色。放到不能放的时候,此时只有两种情况:(1,1,1)/(2,2,2),我们找到最靠上的一个可选择的行k,那么k-1一定是不可选择的,而且和它颜色不同。我们把这一行的颜色变一下,那么就会变得有解 (1,2,3)/(0,1,2)。
我们使用了 调整法,当有多个选择的时候先随便选择一个,等到后面再决定选择哪个。
小结:
构造题考验人类智慧。很多时候都是构造简单的结构,组成最后的构造。构造题一般是构造一些特殊的东西,不太可能根据输入的不同构造完全不同的东西(太毒瘤了)。
构造 ×× 数量,可以考虑进制拆分。问题复杂,可以考虑把问题规约到小范围。打表找规律。