1. 程式人生 > >UVa 11134 Fabled Rooks 算法分析

UVa 11134 Fabled Rooks 算法分析

端點 處理 我們 example lob problem 經典 一個點 本質

難度:β

用時:0

題目:??

代碼:??

這是一道區間貪心題。

題目都不用花心思建模了。要求相當明確。就是要把 n 個點放在 一個 n x n 的網格裏,要求點與點不能共行或共列,每個點的位置還要在一個限制區域裏。

認真思考一下(看劉汝佳的書)不難發現,每個點在 x 方向與 y 方向上的放置是沒有牽連的。所以二維問題可以轉化為兩個一維問題。

那麽問題就是:對 n 個點,找到一種放置方法,使得任意兩個點不重合,且每個點都在其限制區間內。

這是一個經典的貪心問題。

可以從位置上的點考慮這個問題。

對於第一個位置,我們當然想要這樣一個點,這個點的區間包括第一個位置,且區間右端點盡量小。

條件一很好說,條件二就是貪心策略。(一個很簡單的貪心策略)

對於第一個位置,那些可取的點的右端點越大,對後面的位置的作用也越大。

而我們希望不要大材小用。因此要選對後面的位置作用最小的點,把有用的點留在後面用。(當然這個點必須可以在第一個位置)

搞定了第一個位置,就可以用同樣的策略處理第二個位置。它們的本質並沒有區別。所以策略也不變。

那麽總結一下,就是要對每個位置,選取右端點最小的點(保證當前位置在點的定義區間內)。

可能的無解情況是枚舉到某一個位置時發現沒有點可以放到這個位置(那些本來可以的點已經被前面的位置拿去了)。

2018-02-05

UVa 11134 Fabled Rooks 算法分析