題解 | #排座椅#
排座椅
https://ac.nowcoder.com/acm/problem/16618
這道題用貪心,我們先用結(jié)構(gòu)體用來記錄哪一行(pos)或列(pos)需要隔離,這條隔離帶隔離了多少個(gè)(num)
1、先是通過給出兩同學(xué)的坐標(biāo)判斷是隔離行還是隔離帶,如果x,p相同說明在同一行,那么要隔離列min(y,q)列,反之隔離min(x,p)行。
2、當(dāng)完成1數(shù)據(jù)記錄后,通過排序把隔離人數(shù)最多的行和列重大到小排序。
3、排完序后因?yàn)轭}目需要我們輸出的是他的索引,既pos,所以我們再排序通過pos從小到大排,而且范圍是zong+1,zong+1+l(因?yàn)樗f設(shè)置l條縱向)heng同樣道理,這樣我們就可以得到最終結(jié)果
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個(gè)同學(xué)
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;
}