【洛谷】 P1056 【排座椅】

题目链接

因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开。

于是可以吧这条通道累加到一个数组里面。应为题目要求纵列的通道和横列的通道条数有限制,所以我们用贪心,将数据存入结构体在根据每一条线隔开的同学对数排序,得出前k条横线和前l条纵线就是要分割的通道。

因为题目要求输出按照\(a_i<a_{i+1}\)\(b_i<b_{i+1}\)
所以我们在根据\(a_i\)\(b_i\)从小到大排序。

上代码

#include<bits/stdc++.h>
using namespace std;
int n,m,k,l,o;
int a,b,c,d;
int ks[2009],ls[2009];
struct aa{
    int u,s;
}ans[2009];
int lans;
int u,mx;
bool pp(aa x,aa y)
{
    return x.s>y.s;
}
bool pp1(aa x,aa y)
{
    return x.u<y.u;
}
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&k,&l,&o);
    for(int j=1;j<=o;j++)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        if(a>c || b>d)
        {
            int t;
            t=a;a=c;c=t;
            t=b;b=d;d=t;
        }
        if(c==a+1) ks[a]++;
        if(d==b+1) ls[b]++;
    }
    for(int j=1;j<n;j++)
    {
        if(ks[j]>0)
        {
            lans++;
            ans[lans].u=j;
            ans[lans].s=ks[j];
        }
    }
    sort(ans+1,ans+lans+1,pp);
    sort(ans+1,ans+k+1,pp1);
    for(int j=1;j<=k;j++)
        printf("%d ",ans[j].u);
    lans=0;
    for(int j=1;j<m;j++)
    {
        if(ls[j]>0)
        {
            lans++;
            ans[lans].u=j;
            ans[lans].s=ls[j];
        }
    }
    puts("");
    sort(ans+1,ans+lans+1,pp);
    sort(ans+1,ans+l+1,pp1);
    for(int j=1;j<=l;j++)
        printf("%d ",ans[j].u);
    return 0;
}

转载于:https://www.cnblogs.com/linjiale/p/9668409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值