P1056 排座椅

题目描述

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

同学们在教室中坐成了 \(M\) 行 \(N\) 列,坐在第 \(i\) 行第 \(j\) 列的同学的位置是\((i,j)\) \((i,j)\),为了方便同学们进出,在教室中设置了 \(K\) 条横向的通道,\(L\) 条纵向的通道。

于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了2个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。

输入格式

第一行,有 5 个用空格隔开的整数,分别是 \(M\) , \(N\) , \(K\) , \(L\) , \(D\) \((2 \le N,M \le 1000,0 \le K<M,0 \le L<N,D \le 2000)\)

接下来的 \(D\) 行,每行有44个用空格隔开的整数。第 \(i\) 行的 4 个整数\(X_i\) , \(Y_i\) , \(P_i\) , \(Q_i\),表示坐在位置 \((X_i,Y_i)\) 与 \((P_i,Q_i)\) 的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优方案的唯一性。

输出格式

共两行。

第一行包含KK个整数 \(a_1,a_2,…,a_K\)​,表示第 \(a_1\) ​行和 \(a_1+1\)行之间、第 \(a_2\) ​行和\(a_2+1\) 行之间、…、第 \(a_K\) ​行和第\(a_K+1\) 行之间要开辟通道,其中 \(a_i< a_i+1\),每两个整数之间用空格隔开(行尾没有空格)。

第二行包含 \(L\) 个整数 \(b_1,b_2,…,b_L\) ,表示第 \(b_1\) ​列和 \(b_1+1\) 列之间、第 \(b_2\) ​列和 \(b_2+1\) 列之间、…、第 \(b_L\) ​列和第 \(b_L+1\) 列之间要开辟通道,其中 \(b_i< b_i+1\),每两个整数之间用空格隔开(列尾没有空格)。

输入输出样例

输入 #1复制

4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 4

输出 #1复制

2

2 4

说明/提示

上图中用符号*、※、+标出了33对会交头接耳的学生的位置,图中33条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。

2008年普及组第二题

【思路】

排序 + 贪心

贪心原理很简单很好想

就是优先在能隔开最多交头接耳的同学的行或者列上面安排通道

以达到隔开最多交头接耳的同学的目的

输入每一对交头接耳交头接耳的同学的位置,

然后判断一下是左右相邻还是前后相邻

如果是左右相邻那这两个位置里面小的那一列就在桶里面计数器累加

如果是前后相邻的话那就按照上面的处理行,也是小的

为什么是小的记录呢?

因为输出格式里面说了!

\(a_1\)表示\(a_1\) ?行和 \(a_1+1\)行之间

所以自然而然的要记录小的那个咯

记录完成之后就要排序了,不过说到排序

前面记录的时候就需要用结构图记录了

因为你需要输出的是行数而不是每一行能够隔开的学生

所以结构体里面存一个计数器和一个标记是多少号的变量

排序的时候自己重新定义一下结构体排序就好了

先按照计数器的大小排序

将这里面贪心贪出的前K大能够隔开学生的数

不过题目中还暗示了你

要按编号从小到大的顺序输出每一行或者是列

所以还需要再拍一下序,

不过这次的排序是按照标记的是多少号来排序

将小的号放在前面输出

【完整代码】

#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std;
const int Max = 1005;
struct node
{
int js,hao;
};
node hang[Max],lie[Max]; bool cmp(const node a,const node b)
{
return a.js > b.js;
}
bool cmp1(const node a,const node b)
{
return a.hao < b.hao;
} int main()
{
int m,n,k,l,d;
int x1,x2,y1,y2;
cin >> m >> n >> k >> l >> d;
for(int i = 1;i <= m;++ i)
hang[i].hao = i;
for(int i = 1;i <= n;++ i)
lie[i].hao = i;
for(int i = 1;i <= d;++ i)
{
cin >> x1 >> y1 >> x2 >> y2;
if(x1 == x2)
lie[min(y1,y2)].js ++;
else
if(y1 == y2)
hang[min(x1,x2)].js ++;
}
sort(lie + 1,lie + Max + 1,cmp);
sort(lie + 1,lie + l + 1,cmp1); sort(hang + 1,hang + Max + 1,cmp);
sort(hang + 1,hang + k + 1,cmp1); for(int i = 1;i <= k;++ i)
cout << hang[i].hao << " ";
cout << endl;
for(int i = 1;i <= l;++ i)
cout << lie[i].hao << " ";
return 0;
}

洛谷 P1056 排座椅 题解的更多相关文章

  1. 洛谷P1056 排座椅

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

  2. 洛谷 P1056 排座椅

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

  3. 洛谷 P1056 排座椅 桶排序

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

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

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

  5. 洛谷——P1056 排座椅

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

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

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

  7. java实现 洛谷 P1056 排座椅

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

  8. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  9. 洛谷 U86564 排队形

    洛谷 U86564 排队形 题目传送门 题目背景 \(JDFZ2019\)秋季运动会开始辣!为了使强大的高一 · \(6\)班有一个更好的精神面貌,班主任\(T\)老师和体委\(LY\),\(LYB\ ...

随机推荐

  1. Jmeter+Ant+Jenkins构建接口自动化测试平台(Windows)

    一.首先先介绍下我的环境: 1. win10系统 2. ant版本:apache-ant-1.10.1(作用:执行脚本,便于后期的持续集成,下载地址:http://ant.apache.org/bin ...

  2. Oracle——无法在查询中执行 DML 操作

    今天在调用Oracle Function遇到一个异常

  3. Math对象的一些方法

    ceil(n) 返回n向上取整的最近的整数floor(n) 返回n向下取整到最近的整数max(a,b,c...) 返回最大值min(a,b,c...) 返回最小值round(n) 返回n四舍五入的最近 ...

  4. AJAX 初识

    AJAX全称为 Asynchronous Javasript And XML,是在浏览器端进行网络编程(发送请求,接收响应)的技术方案.AJAX 也就是浏览器提供的一套API,可以供 Javascri ...

  5. iOS学习之字符串(NSString)的截取、匹配、分隔

    截取 NSString *str1 = @"this is zero"; 1.从第三个字符开始,截取长度为2的字符串.........注:空格算作一个字符 NSString *st ...

  6. TP5配置隐藏入口index.php文件,Apache/phpstudy

    一,找到/public/.htaccess文件,如果你的入口文件已经移动到根目录下,那么你的.htaccess文件也要剪切到根目录下,总之要确保.htaccess跟入口的index.php保持同级. ...

  7. js 数组的深度拷贝 的四种实现方法

    首先声明本人资质尚浅,本文只用于个人总结.如有错误,欢迎指正.共同提高. --------------------------------------------------------------- ...

  8. RNN、LSTM介绍以及梯度消失问题讲解

    写在最前面,感谢这两篇文章,基本上的框架是从这两篇文章中得到的: https://zhuanlan.zhihu.com/p/28687529 https://zhuanlan.zhihu.com/p/ ...

  9. Vue过渡效果的实现

    1.Vue 过渡组件 Vue 在插入.更新或者移除 DOM 时,使用内置的过渡封装组件可以实现过渡效果 语法格式: <transition name = "xx"> & ...

  10. Java精通并发-锁升级与偏向锁深入解析

    对于synchronized关键字,我们在实际使用时可能经常听说用它是一个非常重的操作,其实这个“重”是要针对JDK的版本来说的,如今JDK已经到了12版本了,其实对这个关键字一直是存在偏见的,它底层 ...