ACM 粗心永远AC不了系列——小Hi的烦恼|“五维数点”问题

2024-03-30 04:48

本文主要是介绍ACM 粗心永远AC不了系列——小Hi的烦恼|“五维数点”问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


问题来源:hiho一下第147周 小Hi的烦恼

题目1 : 小Hi的烦恼

时间限制: 5000ms
单点时限: 1000ms
内存限制: 1024MB
描述

小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好。

小Hi在高中期间参加了市里的期末考试,一共五门:语文、数学、英语、物理、化学。

成绩出来之后,小Hi发现有些同学,所有科目都考的比他好,他很烦恼。所以他想知道所有科目都比自己名次靠前的同学的人数。

为了方便,可以认为不存在两个人某一门名次是相同的。

其他同学们也想知道有多少人全面碾压了他们,所以你需要对所有人输出答案。

解题方法提示

输入

第一行,一个正整数N(N <= 30000),表示人数。

接下来N行,每行五个整数,分别表示五门课依次的排名。

输出

输出共N行,每行一个整数,表示答案。

样例输入
4
1 1 2 2 1
2 3 3 3 2
3 2 1 1 3
4 4 4 4 4
样例输出
0
1
0
3
=====================================我是分割线======================================

思路1:直接两两比较,算法效率O(N ^2),肯定没那么简单,这样输进去的结果是超时。

思路2:一种非常巧妙的位映射操作,使得效率打到O(N^2/32)。具体操作如下

样例输入
4
1 1 2 2 1
2 3 3 3 2
3 2 1 1 3
4 4 4 4 4

1.按输入建立个人排名pr[][]、各科排名sr[][]



2.生成排名比较表rc[][],rc[i][j]表示第j科比i名靠前的同学学号是什么,用位表示


第n位为1表示n号同学在第i名之前

这样子每n行只需要考虑比n-1行1位1就行了,而这个1可以从sr中得到 耗时O(5N)



3.根据排名比较表rc[][]和个人排名表pr[][]对应生成所有科目比自己强的人的集合


这个用betset数据结构就可以表示对位操作,很方便


源代码


import java.util.BitSet;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner cin = new Scanner(System.in);while (cin.hasNext()) {int n = cin.nextInt();int pr[][] = new int[n][5];// 第a号学生第b科排rank[i][j]名int sr[][] = new int[n + 1][5];// 第a科排第b名的学生是id[j][i]号BitSet rc[][] = new BitSet[n + 1][5];// 比a号学生第b科排名靠前的学生的集合BitSet[i][j],第i位为1表示i号学生比a号学生第b科靠前for (int i = 0; i < n; i++) {for (int j = 0; j < 5; j++) {int k = cin.nextInt();pr[i][j] = k;// 个人排名,i号学生的j科排第 k 名sr[k][j] = i;// 科目排名,j科的排第k名是i号学生}}for (int j = 0; j < 5; j++) {// 构建排名详情表 j表示第j科rc[1][j] = new BitSet(n);// j科排名在第k名之上的学生为0for (int k = 2; k <= n; k++) {// k表示第k名 j科排名在第k名之上的学生是那几个rc[k][j] = new BitSet(n);rc[k][j].or(rc[k - 1][j]);// 获取第排名在k-1名的之上的学生复制过来rc[k][j].set(sr[k - 1][j]);// 把第k-1名的学生设置为true}}for (int i = 0; i < n; i++) {// i表示第i号学生 输出结果int k = 0, lastk = 0;for (int j = 3; j >= 0; j--) {// j表示第j科,从倒数第二科开始向后与k = pr[i][j];// k表示学号为i的学生第j科排第k名lastk = pr[i][j + 1];// lastk表示学号为i的学生第j + 1科排第lastk名rc[k][j].and(rc[lastk][j + 1]);}System.out.println(rc[k][0].cardinality());}}}
}

这篇关于ACM 粗心永远AC不了系列——小Hi的烦恼|“五维数点”问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860509

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

MAVEN3.9.x中301问题及解决方法

《MAVEN3.9.x中301问题及解决方法》本文主要介绍了使用MAVEN3.9.x中301问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录01、背景02、现象03、分析原因04、解决方案及验证05、结语本文主要是针对“构建加速”需求交

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc