洛谷训练场——简单模拟 排座位(P1056)
题目描述
上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。
同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。
于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了2个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少
输入样例 输出样例
4 5 1 2 3 2
4 2 4 3 2 4
2 3 3 3
2 5 2 4 样例最优解图析:
题目分析:
既然是模拟题,先看情景需求,再看样例,一看到“最好的”、“最优解” ,不禁感叹,又是一道贪心,再通过对样例图的分析可以知道,每一行每一列都有一个价值,根据每一行的价值从大到小,进行优先切分,
然后再根据列的价值对列进行切分。贪心算法中价值决定数据处理的优先级
实现思路:
题目的意思很明确想让我们用有限的横、纵线将最多的交头接耳的学生分开,题目说一定相邻,那么交头接耳的人要么y相等,要么x相等,由于,线有横纵两种,所以下,x、y分别考虑。那么如何得到每一列x,y的价值呢
我最开始的想法是结构体记录下两个数的位置,但后来一像既然是相邻的那么只需要记录一个坐标的x或y即可,所以我选择了用数组直接存储。当x相等的时候存储下y的频数,在x不等的时候存下x的频数。完成记录后,对x,y的频数
进行桶排序,再将排序结果的索引存到新的数组,这时权重的排序就完毕了,然后只要新数组不为0的数从 0 到 k或l就是需要切割的行列。
题解:
#include <stdio.h>
#include <stdlib.h> int min(int a, int b); int main()
{
int m = , n = , k = , l = , d = ;
int x[] = {}, y[] = {};
int col[] = {}, row[] = {}; scanf("%d%d%d%d%d", &m, &n, &k, &l, &d); for (int i = ; i <= d; i++)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2); if (x1 != x2) //判断x是否相等
{ //不等时一定存在y有相同
//取最小加一最大减一
y[min(x1, x2)]++; //价值
}
else
{ //等于
x[min(y1, y2)]++;
}
} for (int i = ; i <= k; i++)
{
//对y进行价值排序 int max = -;
int index = ; for (int j = ; j < m; j++)
{
if (y[j] > max)
{
max = y[j];
index = j;
}
}
y[index] = ;
col[index]++;
} for (int i = ; i <= l; i++)
{//对y进行价值排序
int max = -;
int index = ; for (int j = ; j < n; j++)
{
if (x[j] > max)
{
max = x[j];
index = j;
}
}
x[index] = ;
row[index]++;
} for (int i = ; i < ; i++)
{
if (col[i])//遍历x
{
printf("%d ", i);
}
}
printf("\n"); for (int i = ; i< ;i++)
{
if (row[i])
{
printf("%d ", i);
} } return ;
} int min(int a, int b)
{
return a < b ? a : b;
}
洛谷训练场——简单模拟 排座位(P1056)的更多相关文章
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 洛谷 P4148 简单题 KD-Tree 模板题
Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
- AC日记——导弹拦截 洛谷 P1020 (dp+模拟)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- AC日记——潜伏者 洛谷 P1071 (模拟)
题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...
- 洛谷 P4148 简单题 解题报告
P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...
- 【刷题】洛谷 P3768 简单的数学题
题目描述 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p\),其中gcd ...
随机推荐
- 第1节 Scala基础语法:1、2、概述,什么是scala
Scala编程 1. 课程目标 1.1. 目标1:熟练使用scala编写Spark程序 1.2. 目标2:动手编写一个简易版的Spark通信框架 1.3. 目标3:为阅读Spark内核源码 ...
- Codeforces Global Round 4E(字符串,思维)
#include<bits/stdc++.h>using namespace std;string s,a,b;int main(){ cin>>s; int n=s.size ...
- 基于Qt 5.9.8,编译Qtxlsx
1.源码下载地址:https://github.com/dbzhang800/QtXlsxWriter 2.下载并安装编译时需要的工具 Perl:https://www.perl.org/get.ht ...
- CSS垂直居中的8种方法
CSS垂直居中的8种方法 1.通过verticle-align:middle实现CSS垂直居中. 通过vertical-align:middle实现CSS垂直居中是最常使用的方法,但是有一点需要格外注 ...
- 安装mysql过程中的异常解决
[root@cdh1 ruanjian]# rpm -ivh mysql-community-common-5.7.10-1.el6.x86_64.rpm warning: mysql-comm ...
- 32 commons-lang包学习
maven依赖 <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lan ...
- vue-router重定向redirect
- MyBatis 配置文件详解
根元素<configuration>,子元素: <properties> <setttings> <typeAliases> <typeHandl ...
- idea2019 3.3最新版本破解安装教程
直接给上神秘地址得了:(应该都可以破解) https://www.jianshu.com/p/c7bdc5819d31
- shell脚本中执行sql脚本(mysql为例)
1.sql脚本(t.sql) insert into test.t value ("LH",88); 2.shell脚本(a.sh 为方便说明,a.sh与t.sql在同一目 ...