题目要求:
/*题目描述
本题要求读入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];动态分配了内存大小;
码农之路遥远,且行且努力!!