洛谷刷題日記 P1056 排座椅

2022-03-02 11:21:59 字數 2876 閱讀 7198

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

同學們在教室中坐成了 mm 行 nn 列,坐在第 ii 行第 jj 列的同學的位置是 (i,j)(i,j),為了方便同學們進出,在教室中設定了 kk 條橫向的通道,ll 條縱向的通道。

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

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

第一行,有 55 個用空格隔開的整數,分別是 m,n,k,l,d(2 \le n,m \le 1000,0 \le km,n,k,l,d(2≤n,m≤1000,0≤k接下來的 dd 行,每行有 44 個用空格隔開的整數。第 ii 行的 44 個整數 x_i,y_i,p_i,q_ixi​,yi​,pi​,qi​,表示坐在位置 (x_i,y_i)(xi​,yi​) 與 (p_i,q_i)(pi​,qi​) 的兩個同學會交頭接耳(輸入保證他們前後相鄰或者左右相鄰)。

輸入資料保證最優方案的唯一性。

共兩行。

第一行包含 kk 個整數 a_1,a_2,\ldots,a_ka1​,a2​,…,ak​,表示第 a_1a1​行和 a_1+1a1​+1 行之間、第 a_2a2​行和 a_2+1a2​+1 行之間、…、第 a_kak​行和第 a_k+1ak​+1 行之間要開闢通道,其中 a_i< a_ai​第二行包含 ll 個整數 b_1,b_2,\ldots,b_lb1​,b2​,…,bl​,表示第 b_1b1​列和 b_1+1b1​+1 列之間、第 b_2b2​列和 b_2+1b2​+1 列之間、…、第 b_lbl​列和第 b_l+1bl​+1 列之間要開闢通道,其中b_i< b_bi​輸入 #1複製

4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 4

輸出 #1複製

2

2 4解題思路:

題目理解之後其實就是判斷每一條豎的邊和橫著的邊的權值的大小,然後根據他們的權值進行排序,然後輸出前k,l條大的邊的編號,同時編號也要從小到大進行排序

我先是使用map來進行對邊的權值進行統計,然後用vector來根據邊的權值的大小來進行排序,然後再用vector選取前k,l條符合要求的邊,再進行排序

題目本身不難,比較有趣的地方就是用vector轉存map來使得map能夠根據val的值來進行排序,這一點在之後的做題的過程中可能會比較實用!

單獨貼一下用vector轉存map的排序的**

1

bool cmp(pair a, pairb)

45 vector< pair >vec1;

6for(map::iterator it=row.begin();it!=row.end();it++)

710 sort(vec1.begin(),vec1.end(),cmp);

之後是整個題目的ac**

1 #include2

using

namespace

std;34

const

int maxn=1005

;5 typedef long

long

ll;6

7int

n,m,k,l,d;

8bool

rows[maxn];

9bool

cols[maxn];

10 maprow;

11 mapcol;

1213

14bool cmp(pair a, pairb)

1718

intmain()

1936

else

3740}41

if(y1==y2)

4249

else

5053}54

}55 vector< pair >vec1;

56for(map::iterator it=row.begin();it!=row.end();it++)

5760

sort(vec1.begin(),vec1.end(),cmp);

61 vectorcolindex;

62 vector< pair >::iterator its =vec1.begin();

63for(int i=0;ii)

6468 vector< pair >vec2;

69for(map::iterator it=col.begin();it!=col.end();it++)

7073

sort(vec2.begin(),vec2.end(),cmp);

74 vectorrowindex;

75 vector< pair >::iterator itss =vec2.begin();

76for(int i=0;ii)

7781

sort(colindex.begin(),colindex.end());

82sort(rowindex.begin(),rowindex.end());

83for(int i=0;ii)

8490 cout<91for(int i=0;ii)

9298 cout<100return0;

101 }

做題的時候變數的名字最好和題目給的名字相互對應,這樣不容易出錯!

洛谷 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 求出一條分割最多的線後...