UVa11134傳說中的車

2022-05-19 19:08:28 字數 1587 閱讀 3268

今天給大家說一下這道題,題意就不說了,主要說一下思路以及細節部分。

首先,從這道題來看就是求出車的座標並且使得車之間不互相攻擊且要滿足車在規定的範圍(矩形)之中,由於紫書說這道題考察了我們問題分解的能力,

所以我們從問題分解的角度來解決,對於問題分解,我們可以通過這種方法來簡化問題,從而更好的解決,這道題而言,我們需要將橫座標與縱座標分開,

乍一看橫縱座標怎麼能分開呢?仔細想一想橫縱座標之間沒有聯絡,所以可以分別從橫、縱座標入手來解決問題,這樣我們將二維的圖轉化成了一維。

我們看看轉換成一維後得到的結果,就是滿足在區間內選擇不重複的點,使得每個點都有對應的區間,類似於區間選點問題,所以我們要用貪心的方式來

找出解。我們在選擇點時一定要滿足不影響或者最小化影響後面的點的選擇,這樣如果都求不出來結果那麼就輸出impossible了吧!我們怎麼才能

最小化影響後面選點的情況呢?根據區間選點的思路,我們需要對每個區間的結尾x1、y1等以他們作為優先考慮的物件進行排序,為什麼不能以x0、y0呢?

對於這個疑問我給出乙個樣例,然後大家想想就明白了。

樣例如下:

311

3311

3322

22

大家想一想輸出,然後看看自己的程式能不能輸出正確的答案。

所以,我們確定了先按x1、y1從小到大排序,然後相同時按照x0、y0從大到小排序(想一想,為什麼?),對橫、縱座標分別進行處理後我們合併輸出答案就可以了。

下面是**:

//

uva 11134

//問題分解

/*橫與豎互不影響,所以將它們分開進行計算,這樣我們將

二維轉化成為了一維,然後成為了區間選點類似的問題,貪心法進行求解。

*/#include

#include

#include

using

namespace

std;

const

int maxn = 5000 + 5

;int

x0[maxn], x1[maxn], y0[maxn], y1[maxn], rec[maxn], vis[maxn];

intr[maxn], c[maxn];

bool cmp1(int a, int b)

bool cmp2(int a, int b)

intmain()

if (!vis) ok = 0

; p++;

} sort(rec, rec+n, cmp2);

memset(vis,

0, sizeof

(vis));

p = 0

;

while (p if (!vis) ok = 0

; p++;

}if (!ok) printf("

impossible\n

");

else

for (int i = 0; i < n; ++i) printf("

%d %d\n

", r[i], c[i]);

} return0;

}

傳說中的車 UVa11134

題目鏈結 橫座標和縱座標可以分開處理,就是區間上的貪心問題,貪心策略是按右端點從小到大排序,若右端點相同則按左端點從大到小排序,然後在區間上從左向右取點。define crt secure no warnings include include include include include inc...

UVA11134 傳說中的車

橫縱座標互不影響,所以問題轉化到一維 在n個區間中每個區間選乙個數,n個數都被選一次 將區間按右端點排序,列舉區間,每個區間選最靠左的沒被選過的點 include include include includeusing namespace std const int maxn 5010 int n...

UVa 11134 傳說中的車

題意 在n n的棋盤上放n個車,使得任意兩個車不相互攻擊,且第i個車在乙個給定的矩形ri之內。用4個整數xli,yli,xri,yri來描述第i個矩形。思路 行和列是不影響的,也就是說第i個棋子放在第幾行不會影響它的列數。這樣的話我們就可以分別處理行和列。由於棋子被給定了範圍,這樣的話我們可以用貪心...