题解 | #排座椅#
排座椅
https://ac.nowcoder.com/acm/problem/16618
这道题用贪心,我们先用结构体用来记录哪一行(pos)或列(pos)需要隔离,这条隔离带隔离了多少个(num)
1、先是通过给出两同学的坐标判断是隔离行还是隔离带,如果x,p相同说明在同一行,那么要隔离列min(y,q)列,反之隔离min(x,p)行。
2、当完成1数据记录后,通过排序把隔离人数最多的行和列重大到小排序。
3、排完序后因为题目需要我们输出的是他的索引,既pos,所以我们再排序通过pos从小到大排,而且范围是zong+1,zong+1+l(因为他说设置l条纵向)heng同样道理,这样我们就可以得到最终结果
4、按条件从a[1]输出到a[l]即可,b同理
```#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
struct ty{
int pos,num;
}heng[1200],zong[1200];
int cmp1(ty x,ty y){
return x.num > y.num;
}
int cmp2(ty x,ty y){
return x.pos < y.pos;
}
int main(){
IOS;
int m,n,k,l,d; //m行n列,有k,l条隔离带,d个同学
cin>>m>>n>>k>>l>>d;
for(int i=1;i<=max(n,m);i++){
heng[i].pos = i;
zong[i].pos = i;
}
while(d--){
int x,y,p,q;
cin>>x>>y>>p>>q;
if(x==p){
zong[min(y,q)].num++;
}else{
heng[min(x,p)].num++;
}
}
sort(zong+1,zong+1+n,cmp1);
sort(heng+1,heng+1+m,cmp1);
sort(zong+1,zong+1+l,cmp2);
sort(heng+1,heng+1+k,cmp2);
for(int i=1;i<=k;i++){
cout<<heng[i].pos<<" ";
}cout<<endl;
for(int i=1;i<=l;i++){
cout<<zong[i].pos<<" ";
}cout<<endl;
}