洛谷P1056 排座椅

2022-05-26 20:54:12 字數 2120 閱讀 4521

題目鏈結

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

接下來的\(d\)行,每行有\(4\)個用空格隔開的整數。第\(i\)行的\(4\)個整數\(x_i,y_i,p_i,q_i\),表示坐在位置\((x_i,y_i)\)與\((p_i,q_i)\)的兩個同學會交頭接耳(輸入保證他們前後相鄰或者左右相鄰)。

輸出格式:

共兩行。

第一行包含\(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\),每兩個整數之間用空格隔開(列尾沒有空格)。

輸入樣例#1:

4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 4

輸出樣例#1:
2

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

2023年普及組第二題

因為題目說輸入保證會交頭接耳的同學前後相鄰或者左右相鄰,所以一對同學要分開有且只有一條唯一的通道才能把他們分開。

於是可以吧這條通道累加到乙個陣列裡面。應為題目要求縱列的通道和橫列的通道條數有限制,所以我們用貪心,將資料存入結構體在根據每一條線隔開的同學對數排序,得出前k條橫線和前l條縱線就是要分割的通道。

因為題目要求輸出按照\(a_i,\(b_i。

所以我們在根據\(a_i\)和\(b_i\)從小到大排序。

上**:

#includeusing namespace std;

int n,m,k,l,o;

int a,b,c,d;

int ks[2009],ls[2009];

struct aaans[2009];

int lans;

int u,mx;

bool pp(aa x,aa y)

bool pp1(aa x,aa y)

if(c==a+1) ks[a]++;

if(d==b+1) ls[b]++;

} for(int j=1;j0)

}sort(ans+1,ans+lans+1,pp);

sort(ans+1,ans+k+1,pp1);

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

printf("%d ",ans[j].u);

lans=0;

for(int j=1;j0)

}puts("");

sort(ans+1,ans+lans+1,pp);

sort(ans+1,ans+l+1,pp1);

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

printf("%d ",ans[j].u);

return 0;

}

洛谷 P1056 排座椅

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

洛谷P1056 排座椅

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

洛谷P1056 排座椅

先上題目鏈結 注釋寫得多,直接貼 了 include include include using namespace std intmain else if ay by for i 1 i k i 退出這個迴圈時p為分割最大的線的下標 horizontal tmp false 求出一條分割最多的線後...