P1056 排座椅(找最優解,可以聯想一下貪心)

2021-08-31 01:19:33 字數 1317 閱讀 3337

acm題集:

題目:解法:輸入資料保證最優方案的唯一性。所以一定有乙個唯一解啦。。。 好像是使用貪心的敏感詞 (題還是做得太少了)

單獨看行一條通道能隔開越多的人越划算,

單獨看列一條通道能隔開越多的人越划算,

但是合起來可以嗎?仔細一想,如果一行上有兩個相鄰的同學說話,只要把列隔開,行怎麼隔都不能影響到列,同理列怎麼隔也都不能影響到行。所以行列是無印象的,可分開計算沒隔開一行或者一列所產生的貢獻(隔開人數),貪心按貢獻從大到小把矩形分割開來。

如果解不確定就不行,劃分有多種。但是題目說了解確定啊。。。

預處理一下每一行和每一列交頭接耳的的同學的數量(同行,相鄰列,隔開的時候取小的,所以取小的列,行同理)

#include

#define ll long long

#define fo(i,j,n) for(register int i=j; i<=n; ++i)

using

namespace std;

struct node

}h[1005

],l[

1005];

int m,n,k,l,d;

vector<

int> ver;

intmain()

else

}sort

(h+1

,h+1

+n);

fo(i,

1,k)ver.

push_back

(h[i]

.idx)

;sort

(ver.

begin()

,ver.

end())

;fo(i,0

,k-1

)printf

("%d%c"

,ver[i]

,i==k-1?

'\n'

:' ');

ver.

clear()

;sort

(l+1

,l+1

+m);

fo(i,

1,l)ver.

push_back

(l[i]

.idx)

;sort

(ver.

begin()

,ver.

end())

;fo(i,0

,l-1

)printf

("%d%c"

,ver[i]

,i==l-1?

'\n'

:' ');

return0;

}

貪心 P1056 排座椅

考點 貪心 排序 題意 有m行n列的格仔,d只長度為2的蟲子 可橫可豎 橫向縱向分別可以切k,l刀,問怎樣切可以切死最多的蟲子。其實原題是用走廊拆開上課交頭接耳的學生,不知道為啥我覺得翻譯成上面的文字更好理解。這個題的主要坑點是這一句 就是說不僅要最優切法,而且要按行列號公升序輸出。解法 很基礎的貪...

題解 P1056 排座椅

由於題目是要求最多能隔開多少對會交頭接耳的同學,我們可以用貪心輕鬆求解 幸好走廊的行數列數都是固定的 只需要得到隔開交頭接耳的同學最多的 k 條橫向的通道和 l 條縱向的通道就可以了!掌聲響起來 過程大概是這個樣子 定義兩個陣列 a 和 b,分別儲存行和列的通道可隔開的交頭接耳的同學的對數 將 a ...

題解 P1056 排座椅

這道題稍微思考一下就可以做出來 由題可知,每行每列可以隔開的同學不會重複,所以只要將每行每列可以隔開的同學的對數統計出來,再從大到小排序,最後輸出即可。如下 include includeusing namespace std int ans row 2005 ans cul 2005 儲存每行每列...