貪心 P1056 排座椅

2021-10-01 15:23:11 字數 1620 閱讀 2100

考點:貪心、排序

題意:

有m行n列的格仔,d只長度為2的蟲子(可橫可豎),橫向縱向分別可以切k,l刀,問怎樣切可以切死最多的蟲子。

。。。其實原題是用走廊拆開上課交頭接耳的學生,不知道為啥我覺得翻譯成上面的文字更好理解。

這個題的主要坑點是這一句:

就是說不僅要最優切法,而且要按行列號公升序輸出。

解法:

很基礎的貪心+排序。輸入資料的時候,每條「蟲子」都砍一刀,記錄在該位置砍了一刀,最後看看哪個位置砍的刀數最多,那麼這個位置就要優先選擇。以橫向砍為例,排序後就確定了前k個要砍的位置,然後給這k個再按行號公升序排序,就可以輸出了。

總共4次排序,資料量不大,可以接受。

#include

using

namespace std;

using pii = pair<

int,

int>

;int m,n,k,l,d;

pii rowcut[

1005];

// 某行砍了多少刀

pii colcut[

1005];

// 某列砍了多少刀

// 某一行(列)被砍的刀數越多,說明在這個地方設定走廊的效果越好,排個序,從高到低取k(l)個

intmain()

else

}// second儲存行列號

for(

int i =

1; i < m; i++

) rowcut[i]

.second = i;

for(

int i =

1; i < n; i++

) colcut[i]

.second = i;

// 按照被切數降序排序

sort

(rowcut +

1, rowcut + m,

(pii &a, pii &b));

sort

(colcut +

1, colcut + n,

(pii &a, pii &b));

// 按行號公升序

sort

(rowcut +

1, rowcut +

1+ k,

(pii &a, pii &b));

sort

(colcut +

1, colcut +

1+ l,

(pii &a, pii &b));

for(

int i =

1; i <= k; i++

)for

(int i =

1; i <= l; i++

)return0;

}

這題沒有任何難度,卡了是因為沒仔細讀題!!

洛谷 P1056 排座椅(貪心)

貪心規律 不管是行還是列,優先輸出價值大 即能把交頭接耳同學盡可能多的分開 的序號。使用結構體記錄序號mark和該號序的價值,分別輸入統計所有行序號和所有列序號的價值。因此,只需對統計好的行結構體陣列 列結構體陣列按價值從大到小排序,分別取前k和前l個的位置座標即可,可以證明這是最優的思路。要注意有...

題解 P1056 排座椅

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

題解 P1056 排座椅

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