前言:因为某个同学就算把他和前后(左右)的同学隔开了,他还可以和左右(前后)的同学讲话,完全不影响(不像题解14),所以直接把横竖的同学分别排序再依次输出即可
思路&AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct ty
{
int pos,cnt;
}hang[1005],lie[1005];//因为前后和左右讲话互不影响,所以开两个结构体数组分别记录行和列
//因为对数组排完序,下标会乱,无法做到行列从小到大输出,所以只能定义一个结构体,在结构体内部在存一遍它的下标
bool comp1(const ty &a,const ty &b)
{
return a.cnt>b.cnt;//按照能隔开的讲话人数从大到小排序
}
bool comp2(const ty &a,const ty &b)
{
return a.pos<b.pos;//按照位置先后顺序从小到大排序
}
int main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);
int n,m,k,l,d;//n行m列,k条横向通道隔列同行不同,l条纵向通道隔行同列不同,输入d对
cin>>n>>m>>k>>l>>d;
for(int i=1;i<=n;i++){hang[i].pos=i;}//给每一行编号
for(int i=1;i<=m;i++){lie[i].pos=i;}//给每一列编号
int x,y,p,q;
for(int i=1;i<=d;i++)
{
cin>>x>>y>>p>>q;
if(x==p){lie[min(y,q)].cnt++;}//请注意题目样例中的那个图,输入的并不是xy坐标,而是第几行第几列,不要搞反了;如果行相同,说明靠竖向通道可以隔开两人,这里记竖向通道隔开的左边那一行为索引
else {hang[min(x,p)].cnt++;}//同上
}
sort(hang+1,hang+1+n,comp1);sort(lie+1,lie+1+m,comp1);
sort(hang+1,hang+1+k,comp2);sort(lie+1,lie+1+l,comp2);
for(int i=1;i<=k;i++){cout<<hang[i].pos<<' ';}
cout<<'\n';//别忘了换行
for(int j=1;j<=l;j++){cout<<lie[j].pos<<' ';}
return 0;
}