题解 | #排座椅#

排座椅

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;
}
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务