洛谷 P1056 排座椅 模擬 貪心

2022-07-15 18:45:09 字數 1496 閱讀 4114

上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。

同學們在教室中坐成了$m$行$n$列,坐在第i行第j列的同學的位置是$(i,j)$,為了方便同學們進出,在教室中設定了$k$條橫向的通道,$l$條縱向的通道。

於是,聰明的小雪想到了乙個辦法,或許可以減少上課時學生交頭接耳的問題:她打算重新擺放桌椅,改變同學們桌椅間通道的位置,因為如果一條通道隔開了$2$個會交頭接耳的同學,那麼他們就不會交頭接耳了。

請你幫忙給小雪編寫乙個程式,給出最好的通道劃分方案。在該方案下,上課時交頭接耳的學生的對數最少。

第一行,有$5$個用空格隔開的整數,分別是$m,n,k,l,d(2 \le n,m \le 1000,0 \le k共兩行。

第一行包含$k$個整數$a_1,a_2,…,a_k$,表示第$a_1$行和$a_1+1$行之間、第$a_2$行和$a_2+1$行之間、…、第$a_k$行和第$a_k+1$行之間要開闢通道,其中$a_i< a_i+1$,每兩個整數之間用空格隔開(行尾沒有空格)。

第二行包含$l$個整數$b_1,b_2,…,b_l$,表示第$b_1$列和$b_1+1$列之間、第$b_2$列和$b_2+1$列之間、…、第$b_l$列和第$b_l+1$列之間要開闢通道,其中$b_i< b_i+1$,每兩個整數之間用空格隔開(列尾沒有空格)。

4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 4

2

2 4

!(

上圖中用符號*、※、+標出了\(3\)對會交頭接耳的學生的位置,圖中\(3\)條粗線的位置表示通道,圖示的通道劃分方案是唯一的最佳方案。

2023年普及組第二題

直接模擬即可, 注意輸出必須從小到大.

#include using namespace std;

const int maxn = 1000 + 10;

int m, n, k, l, d;

setansl, ansc;

struct node

} lin[maxn], cal[maxn];

bool cmp(const node& a, const node& b)

void init(int m, int n)

for (int i = 1; i <= n; i++)

}int main()

sort(lin + 1, lin + 1 + m);

sort(cal + 1, cal + 1 + n);

sort(lin + 1, lin + 1 + k, cmp);

sort(cal + 1, cal + 1 + l, cmp);

for (int i = 1; i <= k; i++)

for (int i = 1; i <= l; i++)

}

洛谷p1056 排座椅 模擬,貪心

上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。同學們在教室中坐成了 m m 行 n n 列,坐在第i行第j列的同學的位置是 i,j i j 為了方便同學們進出,...

洛谷 P1056 排座椅(貪心)

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

洛谷 P1056 排座椅

題目描述 上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。同學們在教室中坐成了m行n列,坐在第i行第j列的同學的位置是 i,j 為了方便同學們進出,在教室中設定了...