洛谷刷题日记-P1056 排座椅

题目描述

上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 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 K<M,0 \le L<N,D \le 2000)M,N,K,L,D(2N,M1000,0K<M,0L<N,D2000)。

接下来的 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_{i+1}ai<ai+1,每两个整数之间用空格隔开(行尾没有空格)。

第二行包含 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_{i+1}bi<bi+1,每两个整数之间用空格隔开(列尾没有空格)。

输入输出样例

输入 #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<int,int> a, pair<int,int> b) {
 2     return a.second > b.second;
 3 }
 4 
 5  vector< pair<int,int> > vec1;
 6         for(map<int,int>::iterator it=row.begin();it!=row.end();it++)
 7         {
 8             vec1.push_back(pair<int,int>(it->first,it->second));
 9         }
10         sort(vec1.begin(),vec1.end(),cmp);

 

之后是整个题目的AC代码
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 
  4 const int maxn=1005;
  5 typedef long long ll;
  6 
  7 int n,m,k,l,d;
  8 bool rows[maxn];
  9 bool cols[maxn];
 10 map<int,int> row;
 11 map<int,int> col;
 12 
 13 
 14 bool cmp(pair<int,int> a, pair<int,int> b) {
 15     return a.second > b.second;
 16 }
 17 
 18 int main()
 19 {
 20     while(cin>>n>>m>>k>>l>>d)
 21     {
 22         memset(rows,0,maxn);
 23         memset(cols,0,maxn);
 24         int x1,x2,y1,y2;
 25         for(int i=0; i<d; ++i)
 26         {
 27             cin>>x1>>y1>>x2>>y2;
 28             if(x1==x2)
 29             {
 30                 int a=min(y1,y2);
 31                 if(!cols[a])
 32                 {
 33                     col[a]=1;
 34                     cols[a]=true;
 35                 }
 36                 else
 37                 {
 38                     col[a]++;
 39                 }
 40             }
 41             if(y1==y2)
 42             {
 43                 int a=min(x1,x2);
 44                 if(!rows[a])
 45                 {
 46                     row[a]=1;
 47                     rows[a]=true;
 48                 }
 49                 else
 50                 {
 51                     row[a]++;
 52                 }
 53             }
 54         }
 55         vector< pair<int,int> > vec1;
 56         for(map<int,int>::iterator it=row.begin();it!=row.end();it++)
 57         {
 58             vec1.push_back(pair<int,int>(it->first,it->second));
 59         }
 60         sort(vec1.begin(),vec1.end(),cmp);
 61         vector<int> colindex;
 62         vector< pair<int,int> >::iterator its = vec1.begin();
 63         for(int i=0;i<k;++i)
 64         {
 65             colindex.push_back(its->first);
 66             its++;
 67         }
 68         vector< pair<int,int> > vec2;
 69         for(map<int,int>::iterator it=col.begin();it!=col.end();it++)
 70         {
 71             vec2.push_back(pair<int,int>(it->first,it->second));
 72         }
 73         sort(vec2.begin(),vec2.end(),cmp);
 74         vector<int> rowindex;
 75         vector< pair<int,int> >::iterator itss = vec2.begin();
 76         for(int i=0;i<l;++i)
 77         {
 78             rowindex.push_back(itss->first);
 79             itss++;
 80         }
 81         sort(colindex.begin(),colindex.end());
 82         sort(rowindex.begin(),rowindex.end());
 83         for(int i=0;i<k;++i)
 84         {
 85             if(i==0)
 86                 cout<<colindex[i];
 87             else
 88                 cout<<" "<<colindex[i];
 89         }
 90         cout<<endl;
 91         for(int i=0;i<l;++i)
 92         {
 93             if(i==0)
 94                 cout<<rowindex[i];
 95             else
 96                 cout<<" "<<rowindex[i];
 97         }
 98         cout<<endl;
 99     }
100     return 0;
101 }

做题的时候变量的名字最好和题目给的名字相互对应,这样不容易出错!

 
posted @ 2019-12-29 11:05  小松QAQ  阅读(245)  评论(0编辑  收藏  举报