统计同成绩学生

news2025/4/16 7:01:35

目录

1038:统计同成绩学生

输入格式:

输出格式:

样例:

输入样例:

输出样例:

代码长度限制:

时间限制:

内存限制:

思路:

  1.暴力法

      1.1查找函数

      1.1.2查找函数代码

      1.2main函数

      1.2.1main函数代码

      1.3完整代码

         1.4提交结果

         1.5暴力算法时间复杂度

  2.打表思想

  2.1打表代码

  2.2打表代码提交结果

  2.3打表算法复杂度

       2.3.1时间复杂度

       2.3.2空间复杂度

总结:

题目链接:


1038:统计同成绩学生

本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。

输入格式:

输入在第 1 行给出不超过 105 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。

输出格式:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

样例:

输入样例:

10
60 75 90 55 75 99 82 90 75 50
3 75 90 88

输出样例:

3 2 0

代码长度限制:

16 KB

时间限制:

250 ms

内存限制:

64 MB

思路:

  1.暴力法

      1.1查找函数

         首先跟大家说一下我最开始的思路,首先写一个find函数,函数参数是一个数组a,以及数组a的长度n,还有要询问的分数q.

         这个函数的作用就是在一个排序了的数组a(main函数里面进行sort排序)里面查找有多少个元素是等于q的,进行一次计数,然后返回计数器.

          为什么我们要排序呢?其实不排序也可以,遍历整个数组,如果有等于q的就将计数器+1,然后返回计数器,这样做的复杂度是O(N),排序过后,找等于q的元素个数,复杂度就是O(logN).

           为什么是O(logN)呢?我们知道,排序过后,所有相同的数字都会聚在一起,按样例来说:60 75 90 55 75 99 82 90 75 50,这串数字进行排序过后,就变成了:50 55 60 75 75 75 82 90 90 99,按75来说,三个75都聚在了一起,我们在判断的时候,如果数字中一个数等于q了,但是下一个数不等于q,那么就可以退出循环了!

      1.1.2查找函数代码

int find(int a[],int q,int n){ //查找在长度为n的数组a里面有多少个元素等于q 
	int sum=0; //计数器 
	for(int i=0;i<n;i++){ //遍历计数 
		//在这里,我们给出的数组a是一个有序的序列 
	    if(a[i]==q&&a[i+1]!=q){ //如果相等,下一个又不相等(排序过的数组,相同的数会挨在一起) 
	  	    sum++; //计数器加1 
	  	    break; //退出 
	    }
	    else if(a[i]==q) //如果相等 
	      sum++; //计数器加1 
	}
	return sum; //返回计数器 
}

      1.2main函数

         在main函数里面,我们输入完n个学生成绩的时候,就可以进行排序"从小到大或者从大到小"都可以,不会影响find查找函数的结果,我们可以用STL库系统提供的sort冒泡排序函数,或者自己手写一个排序函数.

         排序过后,进行询问了,我们将find函数的值存在一个变量里面,需要进行一个特判,因为题目中说了行末没有多余的空格,所以如果不是最后一次询问就要输出空格,是的话,不输出空格,还要在输出一个换行!

      1.2.1main函数代码

int main(){
	int n;
	cin>>n; //输入学生数量 
	int a[n]; //定义学生数组 
	for(int i=0;i<n;i++) //下标遍历输入 
	  cin>>a[i]; //输入每一个学生的成绩 
	sort(a,a+n); //进行从小到大排序 
	int k; //询问次数 
	cin>>k; //输入询问次数 
	while(k--){ //进行k次询问 
		int q; //询问分数 
		cin>>q; //输入要询问的分数 
		int t=find(a,q,n); //进行在数组a里面查找有多少个元素等于q 
		if(k!=0) //如果不是最后一次询问 
		  cout<<t<<" "; //要输出空格 
		else //如果是最后一次询问 
		  cout<<t<<endl; //不输出空格,换行 
	}
	return 0; //结束 
}

      1.3完整代码

//1038:统计同成绩学生
//暴力: 
#include<bits/stdc++.h>
using namespace std;
int find(int a[],int q,int n){ //查找在长度为n的数组a里面有多少个元素等于q 
	int sum=0; //计数器 
	for(int i=0;i<n;i++){ //遍历计数 
		//在这里,我们给出的数组a是一个有序的序列 
	    if(a[i]==q&&a[i+1]!=q){ //如果相等,下一个又不相等(排序过的数组,相同的数会挨在一起) 
	  	    sum++; //计数器加1 
	  	    break; //退出 
	    }
	    else if(a[i]==q) //如果相等 
	      sum++; //计数器加1 
	}
	return sum; //返回计数器 
}
int main(){
	int n;
	cin>>n; //输入学生数量 
	int a[n]; //定义学生数组 
	for(int i=0;i<n;i++) //下标遍历输入 
	  cin>>a[i]; //输入每一个学生的成绩 
	sort(a,a+n); //进行从小到大排序 
	int k; //询问次数 
	cin>>k; //输入询问次数 
	while(k--){ //进行k次询问 
		int q; //询问分数 
		cin>>q; //输入要询问的分数 
		int t=find(a,q,n); //进行在数组a里面查找有多少个元素等于q 
		if(k!=0) //如果不是最后一次询问 
		  cout<<t<<" "; //要输出空格 
		else //如果是最后一次询问 
		  cout<<t<<endl; //不输出空格,换行 
	}
	return 0; //结束 
}

         1.4提交结果

         不出意外,超时了(最后一个样例超时了).

         1.5暴力算法时间复杂度

        我们知道,find查找函数的时间复杂度是O(logN),我们需要进行K次find函数,时间复杂度就成了O(KlogN),题目说了,K是一个不大于N的正整数,所以也可以把K看作logN,所以该暴力法真正的时间复杂度为O((logN)^2).题目说了N最大10^5,我们这个复杂度最大确实10^10次方,所以需要优化!

  2.打表思想

  我们可以做一个类似打表的操作(也就是散列表),我们可以定义一个长度为101的数组(下标最大为100),我们将输入的每一个a[i]都当作下标,将这个数组a[i]为下标的地方当作一个计数器,从0开始,不断的+1.

  之后在询问的时候,我们每次只需要输出这个数组下标为q的地方就行了.这个打表思想需要一个额外的存储空间,但是因为输入的分数最大是100,所以需要的存储空间不多,很好的解决了这个问题!

  2.1打表代码

//1038:统计同成绩学生
//正解(打表):
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n; //学生的数量 
	cin>>n; //输入学生数量 
	int a[n],sum[101]={0}; //a是存储学生分数的数组,sum是一个打表数组,每一个下标存的是对应于下标的分数 
	for(int i=0;i<n;i++) //下标遍历输入 
	  cin>>a[i],sum[a[i]]++; //输入每一个学生的分数,进行打表操作 
	int k; //询问次数 
	cin>>k; //输入询问次数 
	while(k--){ //进行k次询问 
		int q; //询问的分数 
		cin>>q; //输入要询问的分数 
		if(k!=0) //如果不是最后一次询问 
		  cout<<sum[q]<<" "; //输出空格 
		else //如果是最后一次询问 
		  cout<<sum[q]<<endl; //不输出空格,输出一个换行 
	}
	return 0; //结束 
}

  2.2打表代码提交结果

  这样简洁的代码(和桶排序简洁的代码如出一辙).

   

  2.3打表算法复杂度

       2.3.1时间复杂度

    时间复杂度非常的低,算上预处理,我们的时间复杂度最大也就是O(2N),比之前快上了不知道多少倍.(俗话说,空间换时间)

       2.3.2空间复杂度

    暴力法的空间复杂度就只是单纯O(N),毕竟只有一个记录学生分数的数组a,但是打表算法的空间复杂度就是O(N+100),对只有100,因为分数最高为100分,只需要定义空间为100大小的数组就行了,对于N最大为10^5次方,那个小小的100可以忽略不计.

    只用了100的小空间,换来了时间复杂度非常大的优化,何乐而不为呢!

总结:

  对于一个代码,不能死板的打暴力,需要灵活的变通,对一个算法进行优化.

题目链接:

PTA | 程序设计类实验辅助教学平台千名教师建设,万道高质量题目,百万用户拼题的程序设计实验辅助教学平台https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805284092887040

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技Build On - 使用Serverless搭建创新零售应用的惊喜体验

近日有幸参加了亚马逊云科技Build On第三季的学习培训&#xff0c;深刻感受到亚马逊在云服务方面技术的先进性。在培训后进行了实操体验&#xff0c;通过Serverless 的事件驱动架构搭建一个快消行业场景的应用——咖啡店的订餐系统。只用了短短的几小时&#xff0c;就完成了整个…

学生管理系统(Python实现)

文章目录学生管理系统介绍学生管理系统效果展示代码实现入口函数打印菜单新增学生信息显示学生信息查找学生信息删除学生信息实现存档读档打包成exe程序学生管理系统介绍 学生管理系统是为了对学校学生信息进行管理而开发的一款软件&#xff0c;下面我们来实现一个命令行版本的…

【UE4 第一人称射击游戏】12-全自动步枪并显示剩余弹药量

上一篇&#xff1a; 【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效 本篇效果&#xff1a; 步骤&#xff1a; 1.打开“Weapon_Base”&#xff0c;添加一个整数类型&#xff0c;名为“Ammo”的变量&#xff0c;用来表示弹药量。编译后默认值设为30 再添加一个浮点…

操作系统~Linux~线程控制,POSIX线程库的使用

1.POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”开头的要使用线程库中的函数&#xff0c;要通过引入头文件<pthread.h>链接这些线程函数库时要使用编译器命令的“-lpthread”选项2.创建线程-pthread_create() 功…

在HTML页面中引用Markdown编辑器(Editor.md)

目录 1、下载Ediotor.md 2、引入Ediotor.md 3、确定Ediotor.md在哪里显示 最近写博客项目&#xff0c;用到了Markdown编辑器&#xff0c;这里介绍一款国内好用的Markdown编辑器&#xff1a;Editor.md&#xff0c;下面介绍一下该编辑器以及如果在页面中引用。 1、下载Edioto…

【TypeScript】类型兼容性与相关类型讲解

目录 类型兼容性 对象类型兼容性 接口类型兼容性 函数类型兼容性 索引签名类型 映射类型 索引查询类型 交叉类型 类型兼容性 在TS中&#xff0c;类型采用的是结构化类型系统&#xff0c;也叫做 duck typing&#xff08;鸭子类型&#xff09;&#xff0c;类型检查关注的…

电脑c盘备份怎么操作?备份C盘的6个步骤

电脑出现问题&#xff0c;想要修复又不知该怎么操作。可能你会想要重装电脑的系统&#xff0c;但是在操作之前&#xff0c;一定要对电脑重要的数据做好备份。尤其是电脑C盘里面存储着我们很多重要的数据&#xff0c;电脑c盘备份怎么进行&#xff1f;跟着下面6个操作步骤进行&am…

<Linux线程池、线程安全(单例模式、STL、智能指针)、读者写者问题及线程扩展与总结>——《Linux》

目录 1.线程池 1.1 线程池: 1.2 线程池的应用场景&#xff1a; 1.3 线程池的种类&#xff1a; 1.4 线程池示例&#xff1a; 1.5 线程池编程模拟实现&#xff1a; 2. 线程安全的单例模式 2.1 什么是单例模式 2.2 什么是设计模式 2.3 单例模式的特点 2.3.1 饿汉实现方…

驱动相关基础

1.程序分类 1.1 裸机程序&#xff1a;直接运行在对应硬件的的程序 1.2 应用程序&#xff1a;只能运行在对应操作系统上的程序 2. 计算机系统的层次结构 2.1 无操作系统的简单的两层结构 2.2 有操作系统的四层层次结构 3. 操作系统 狭义&#xff1a;给应用程序提供运行环…

Python图像处理【7】采样、卷积与离散傅里叶变换

采样、卷积与离散傅里叶变换0. 前言1. 图像傅里叶变换1.1 傅里叶变换基础1.2 傅里叶变换应用1.3 逆傅里叶变换应用2. 利用采样改变图像分辨率2.1 上采样2.2 下采样小结系列链接0. 前言 采样 (Sampling) 是用于选择/丢弃图像像素的空间操作&#xff0c;通常用于增加/减小图像大…

(byte)1658385462>>16=-40,怎么算的?

正文 在 Github 项目mongo-java-driver有一个类ObjectId.java&#xff0c;它的作用是生成唯一 id 的&#xff0c;它的核心实现是下面这样一段代码 [1]&#xff1a; public void putToByteBuffer(final ByteBuffer buffer) {notNull("buffer", buffer);isTrueArgume…

【数据结构Java版】树与二叉树的相关知识全解

目录 一、树型结构 &#xff08;1&#xff09;树的定义 &#xff08;2&#xff09;树的基本术语 &#xff08;3&#xff09;树的存储结构 二、二叉树 &#xff08;1&#xff09;二叉树的定义 &#xff08;2&#xff09;两种特殊二叉树 1.满二叉树 2.完全二叉树 &…

CSS中你可能不知道的Selectors特性

CSS中你可能不知道的Selectors特性本文作者为奇舞团前端开发工程师引言最近看了2022年全球CSS调查报告&#xff0c;发现了一些不常见的伪类和伪元素。伪类:has()html<div><h1>H1</h1><h2>H2</h2><p>h1{margin: 0 0 0.25rem 0}</p> &…

设置访问SSH为密钥访问

1.制作密钥对 ssh-keygen输入会问两个问题 设置公私钥名称&#xff08;可以留白&#xff0c;直接回车&#xff09;设置公私钥密码&#xff08;可以留白&#xff0c;直接回车&#xff09; 第一次输入第二次确认 留空确认的话&#xff0c;生成公私钥。共有两个文件 # 私钥 id…

Rxjava源码分析实践(三)【RxJava基本原理分析之订阅流】

本节,我们从Rxjava使用代码入手,去结合自己已有的知识体系,加查阅部分源码验证的方式,来一起探索一下Rxjava实现的基本原理。 为了本文原理分析环节,可以被更多的人理解、学习,所以小编从初学者的角度,从使用入手,一点点的分析了其中的源码细节、思想,建议大家随着本文…

NCMMSC论文介绍 | 探索语音自监督模型的高效融合算法

本文介绍了清华大学语音与音频技术实验室&#xff08;SATLab&#xff09;与上海交通大学跨媒体语言智能实验室&#xff08;X-LANCE&#xff09;合作的NCMMSC录用论文&#xff1a;Exploring Effective Fusion Algorithms for Speech Based Self-Supervised Learning Models。该论…

动态列合并更新

【问题】 I have one query, would be great if anyone can help me out on this. In SQL, I have two tables with same column names. Want to query if there is any difference in the column values and if yes will update the values(in the first table) else if the…

【工具类】后台Mock工具类

目录一、介绍二、使用方法1. Controller层定义接口2. 编写json文件3. 开启AOP4. 调用接口验证三、源码一、介绍 Controller层定义完接口后&#xff0c;不需要写业务逻辑。编写Json文件&#xff0c;调用接口时返回json文件的数据。 优点&#xff1a; 设计阶段即可定义好接口&…

Centos 图形化yum管理工具 - yum Extender

文章目录背景安装开启yum-GUI工具 - yumexyum list installed列出软件包的依赖yum cleam背景 作为一个yum工程师&#xff0c;长期备受yum 命令的煎熬。 难道yum就乜有一个GUI管理界面吗&#xff1f; yum Extender (简称 yumex ) , 是 yum 的图形化操作界面。可以通过 yumex 方…

ActiveMQ高级特性和大厂面试常考重点

目录 一、引入消息队列之后该如何保证其高可用性 二、异步投递Async Sends 三、延迟投递和定时投递 四、ActiveMQ消费重试机制 五、死信队列 六、如何保证消息不被重复消费呢?幂等性问题你谈谈 一、引入消息队列之后该如何保证其高可用性 ActiveMQ集群模式_zoeil的博客-…