上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的 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 34 2 4 3
2 3 3 3
2 5 2 4
輸出 #1複製
22 4解題思路:
題目理解之後其實就是判斷每一條豎的邊和橫著的邊的權值的大小,然後根據他們的權值進行排序,然後輸出前k,l條大的邊的編號,同時編號也要從小到大進行排序
我先是使用map來進行對邊的權值進行統計,然後用vector來根據邊的權值的大小來進行排序,然後再用vector選取前k,l條符合要求的邊,再進行排序
題目本身不難,比較有趣的地方就是用vector轉存map來使得map能夠根據val的值來進行排序,這一點在之後的做題的過程中可能會比較實用!
單獨貼一下用vector轉存map的排序的**
1bool 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 求出一條分割最多的線後...