题目地址:https://www.luogu.com.cn/problem/P1056

题解原地址:https://createsj.blog.luogu.org/solution-p1056

由于题目是要求最多能隔开多少对会交头接耳的同学,我们可以用贪心轻松求解(幸好走廊的行数列数都是固定的),只需要得到隔开交头接耳的同学最多的 k 条横向的通道和 l 条纵向的通道就可以了!掌声响起来~

过程大概是这个样子:

  1. 定义两个数组 a 和 b,分别储存行和列的通道可隔开的交头接耳的同学的对数;

  2. 将 a 和 b 按可所隔开的同学的对数从大到小排序

  3. 输出 a 的前 k 个元素所代表的通道的位置和 b 的前 l 个元素所代表的通道的位置。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MIN(A,B) ((A<B)?A:B)//求两个数中的最小值
using namespace std;
struct st//定义一个结构体,储存在第 l 行/列和第 r 行/列之间插入走廊后能隔开 v 对同学
{
int v,l,r;
}*a/*行*/,*b/*列*/;
inline bool cmp1(const st x,const st y)
{
return x.v>y.v;
}
inline bool cmp2(const st x,const st y)
{
return x.l<y.l;
}
int main()
{
int m,n,k,l,d;
scanf("%d %d %d %d %d",&m,&n,&k,&l,&d);
//为 a,b 动态分配内存,也可之间用 a[1001],b[1001],不过本人只是想省省内存
a=new st[m+1];
b=new st[n+1];
//初始化
memset(a,0,sizeof(st)*n);//数组 a 清零
memset(b,0,sizeof(st)*n);//数组 b 清零
//初始化 l 和 r
for(int i=1;i<m;i++)
a[i].l=i,a[i].r=i+1;
for(int i=1;i<n;i++)
b[i].l=i,b[i].r=i+1;
//输入和处理输入数据
for(int i=0,x,y,p,q;i<d;i++)
{
scanf("%d %d %d %d",&x,&y,&p,&q);
if(x!=p)//如果 x!=p,说明两名同学不在同一行,所以就在同一列
a[MIN(x,p)].v++;
else//否则,说明两名同学在同一行
b[MIN(y,q)].v++;
}
sort(a,a+m,cmp1);//以 v 来为数组 a 从小到大排序
sort(a,a+k,cmp2);//以插入顺序来为数组 a 的前 k 个元素排序
sort(b,b+n,cmp1);//以 v 来为数组 b 从小到大排序
sort(b,b+l,cmp2);//以插入顺序来为数组 b 的前 l 个元素排序
//输出
for(int i=0;i<k;i++)
printf("%d ",a[i].l);
putchar('\n');
for(int i=0;i<l;i++)
printf("%d ",b[i].l);
//清空动态分配的内存
delete [] a;
delete [] b;
return 0;
}

题解 P1056 【排座椅】的更多相关文章

  1. 洛谷 P1056 排座椅 题解

    P1056 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 \(D\ ...

  2. 洛谷 P1056 排座椅

    P1056 排座椅 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上 ...

  3. 洛谷P1056 排座椅

    洛谷P1056 排座椅 洛谷传送门 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有 ...

  4. 洛谷 P1056 排座椅 桶排序

    桶排序大法好! 每次一看到这种范围小的题,本萌新就想用桶排. 因为题目中的m,n都小于1000,我们就可以定义两个1000的数组,表示每一行或每一列可以隔开几对讲话的童鞋. 然后再定义两个1000的数 ...

  5. 洛谷 P1056 排座椅【贪心/结构体排序】

    题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...

  6. 洛谷——P1056 排座椅

    https://www.luogu.org/problem/show?pid=1056#sub 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主 ...

  7. 洛谷P1056——排座椅(模拟,贪心,排序)

    https://www.luogu.org/problem/show?pid=1056 题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发 ...

  8. P1056 排座椅

    非原创 #include<bits/stdc++.h>using namespace std;int t1[2009];int t2[2009]; int findmax(int *a){ ...

  9. luogu P1056 排座椅

    题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...

  10. java实现 洛谷 P1056 排座椅

    import java.util.Arrays; import java.util.Map.Entry; import java.util.Scanner; import java.util.Tree ...

随机推荐

  1. 自动化运维工具:ansible

    自动化运维工具:ansible Ansible(1):简介和基本概念 Ansible(2):安装配置 Ansible(3):ansible资源清单管理 Ansible(4):常用模块

  2. 对C语言整数类型的一点理解

    作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4321635.html 1.先从一个列子引出问题: //sample_1 unsigned ch ...

  3. 珠峰-express

    ##### #### 中间件的作用 #### 自己写的Route方法 #### #### 中间件

  4. centos7安装node.js

    安装版本:node-v10.15.3 一.安装必要的编译软件包 # yum install gcc gcc-c++ -y 二.从源码下载Nodejs 进入官网选择自己需要的版本 https://nod ...

  5. Android Studio 学习笔记(五):WebView 简单说明

    Android中一个用于网页显示的控件,实际上,也可以看做一个功能最小化的浏览器,看起来类似于在微信中打开网页链接的页面.WebView主要用于在app应用中方便地访问远程网页或本地html资源.同时 ...

  6. 机器学习算法——kNN

    顶级数据挖掘会议ICDM于2006年12月评选出了数据挖掘领域的十大经典算法,kNN便是其中一个. kNN算法的思想是:在训练集中选取与输入数据最近的k个邻居,统计k个邻居中出现次数最多的类别,以此作 ...

  7. codeforces 1301C Ayoub's function

    题目链接:http://codeforces.com/problemset/problem/1301/C 思路: 纯想想了一次,发现one_cnt >= zero_cnt的时候很简单,就是(n) ...

  8. MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)

    新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...

  9. Android中获取目标布局文件中的组件

    方法如下: LayoutInflater flater= LayoutInflater.from(getContext()); //R.layout.title处填写目标布局 final View v ...

  10. 后端跨域的N种方法

    简单来说,CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Co ...