算法题查询学生成绩

题目要求:

/*题目描述

本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出。
输入描述:
输入在第1行给出不超过10^5的正整数N,即学生总人数。随后1行给出N名学生的百分制整数成绩,中间以空格分隔。最后1行给出要查询的分
数个数K(不超过N的正整数),随后是K个分数,中间以空格分隔。
输出描述:
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
输入例子:

10

60 75 90 55 75 99 82 90 75 50

3 75 90 88


输出例子:

3 2 0*/


先说说我原本的思路;

1、用两个数组分别存储两次输入的信息;

2、根据第二个数组,逐个与第一个数组里的元素进行比较;

3、想利用折半查找;


但是写到一半发现这种思路是不对的,倘若利用折半查找,须对第二次输入的每个元素都各进行一次这般查找,当输入个数过多时,时间空间利用率显然不合理;

于是看到了http://blog.csdn.net/liuhuiyan_2014/article/details/47522791的思路及算法实现;

我在这里算是在对自己看到的别人优秀的代码,再整理一次,以便日后回看。

#include<iostream>
using namespace std;
int main()
{
int N;
cin>>N;

int scoreNum[101]={0}; //定义一个100大小的数组存放成绩;下标即为成绩;默认都为0个;
int num;
int count;

while(N--)
{
cin>>num;
scoreNum[num]++;} //若输入的成绩与下标相同,则增加1;

cin>>count;//输入查询的个数;
int *index=new int [count];//开辟一个新的数组,大小为输入的查询个数;
int k=0;
while(count--)
{
cin>>num;
index[k++]=num; //将要查询的分数存入index[]数组中;


}

for(int i=0;i<k;i++)
{

if(i+1==k)
cout<<scoreNum[index[i]];
else
cout<<scoreNum[index[i]]<<" ";



}
cout<<endl;
return 0;




}


我认为这个算法的优点有:

1、将第一次输入的数据转化成对 0-100下标元素的统计;这样在第一次输入时就已经完成统计的功能;

2、第二次输入的数据用index[]数组存储,再利用scoreNum(index[i]),这样就将两个数组通过下标联系起来;

3、new的用法;

int *index=new int [count];动态分配了内存大小;


码农之路遥远,且行且努力!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值