难度:β
用时:0
题目:??
代码:??
这是一道区间贪心题。
题目都不用花心思建模了。要求相当明确。就是要把 n 个点放在 一个 n x n 的网格里,要求点与点不能共行或共列,每个点的位置还要在一个限制区域里。
认真思考一下(看刘汝佳的书)不难发现,每个点在 x 方向与 y 方向上的放置是没有牵连的。所以二维问题可以转化为两个一维问题。
那么问题就是:对 n 个点,找到一种放置方法,使得任意两个点不重合,且每个点都在其限制区间内。
这是一个经典的贪心问题。
可以从位置上的点考虑这个问题。
对于第一个位置,我们当然想要这样一个点,这个点的区间包括第一个位置,且区间右端点尽量小。
条件一很好说,条件二就是贪心策略。(一个很简单的贪心策略)
对于第一个位置,那些可取的点的右端点越大,对后面的位置的作用也越大。
而我们希望不要大材小用。因此要选对后面的位置作用最小的点,把有用的点留在后面用。(当然这个点必须可以在第一个位置)
搞定了第一个位置,就可以用同样的策略处理第二个位置。它们的本质并没有区别。所以策略也不变。
那么总结一下,就是要对每个位置,选取右端点最小的点(保证当前位置在点的定义区间内)。
可能的无解情况是枚举到某一个位置时发现没有点可以放到这个位置(那些本来可以的点已经被前面的位置拿去了)。
2018-02-05