排座椅

排座椅

https://ac.nowcoder.com/acm/problem/16618

题意

班里有m行n列个座位,一共有d对同学紧挨着(前后或者左右)喜欢讲话,小雪可以在教室中设置了K条横向的通道,L条纵向的通道,通道可以分开挨着的同学,问通道设置在什么位置可以使班上讲话的人数最少。

题解

简单的贪心。每条通道肯定是能分开的同学越多越好,所以枚举喜欢讲话的同学,将他们之间的路记录下来,行和列用不同的数组记录,然后行和列都由大到小排序路的个数。排序后,将行中前K个路按照路的编号由小到大排序后输出这K条路,列中前L个路也同样操作。

代码

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int res,id;
}a[100100],b[100100];

int cmp(node x,node y)
{
    return x.res>y.res;
}

int cmp2(node x,node y)
{
    return x.id<y.id;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m,k,l,d;
    cin>>n>>m>>k>>l>>d;
    int k1=0,k2=0;
    for(int i=0;i<d;i++){
        int x1,x2,y1,y2;
        cin>>x1>>y1>>x2>>y2;
        if(x1==x2){
            int y=min(y1,y2);
            b[y].id=y;
            b[y].res++;
        }
        else {
            int x=min(x1,x2);
            a[x].id=x;
            a[x].res++;
        }
    }
    sort(a+1,a+1+m,cmp);
    sort(b+1,b+1+n,cmp);
    sort(a+1,a+1+k,cmp2);
    sort(b+1,b+1+l,cmp2);
    for(int i=1;i<=k;i++) {
        if(!a[i].id) break;
        cout<<a[i].id<<' ';
    }
    cout<<endl;
    for(int i=1;i<=l;i++) {
        if(!b[i].id) break;
        cout<<b[i].id<<' ';
    }
    cout<<endl;
    return 0;
}

全部评论

相关推荐

01-17 11:57
已编辑
门头沟学院 前端工程师
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务