nyoj 16 矩形巢狀

2021-06-16 15:36:52 字數 1085 閱讀 2492

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:4

描述有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中當且僅當ab套在(6,2)內,但不能巢狀在(3,4)中。你的任務是選出盡可

能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下乙個矩形內。

輸入 第一行是乙個正正數n(0每組測試資料的第一行是乙個正正數n,表示該組測試資料中含有矩形的個數(n<=1000)

隨後的n行,每行有兩個數a,b(0每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行

樣例輸入

1

101 2

2 45 8

6 10

7 93 1

5 812 10

9 72 2

樣例輸入

3

10 100

100 5

5 50

樣例輸出

5
解析:

咋看不知道該怎麼做,雙向判斷的,與單調遞增子串行好像不一樣。但仔細想想,總的來說,還是要遞增的

序列,只不過是長和寬都要遞增,那就很好說了,先按照寬進行 sort 排序,再次,就是對長進行單調遞增篩選

了。即,我這次篩選的方法是同步乙個陣列,用來儲存當前的最多的個數,不斷更新陣列中的值,在用 max 來

不斷進行比較更新,最後輸出 max 即可。

具體**如下:

#include#includeusing namespace std;

typedef struct

t;t q[1002];

int cmp(t a,t b)

q[i].x=a;q[i].y=b;

}sort(q,q+n,cmp);

for(max=0,i=0;iq[j].y&&q[i].x>q[j].x)

s[i]=s[i]>(s[j]+1)?s[i]:(s[j]+1);

if(max

NYOJ 16 矩形巢狀

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...

NYOJ16 矩形巢狀

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 1...

NYOJ 16 矩形巢狀

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...