题目连接:请点击
思路:看到此题,第一反应就是两个数组分别存放N个学生的成绩与需要统计分数的成绩,然后两层循环嵌套来求,但是此方法最后一个测试点运行超时,然后发现可以只用1个数组,但其实效果还是一样,时间复杂度未变,依然需要两层循环嵌套
如下所示,最后一个测试点运行超时
#include<iostream>
#include<vector>
using namespace std;
int main()
{//最后一个测试点运行超时
int N,K;
scanf("%d",&N);
vector<int> v(N);
for(int i=0;i<N;i++)
cin>>v[i];
scanf("%d",&K);
int flag=0,grade;
for(int i=0;i<K;i++)
{
scanf("%d",&grade);
int num=0;
for(int j=0;j<N;j++)
{
if(grade==v[j])
num++;
}
if(flag) printf(" ");
printf("%d",num);
flag=1;
}
}
无奈就想着怎样减少查找的时间,提高算法的效率。就上网查找发现其实可以只申请一个数组,然后用数组的下标来表示学生的成绩,数组内直接就是该下标所代表的成绩的学生个数,这样既节省了空间又节约了时间。这种方法以前也没少见过,但是有的时候就是陷入这么一个死循环,只想着去提高查找的效率了。^^
AC代码
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int N,K;
scanf("%d",&N);
vector<int> v(101);
for(int i=0;i<N;i++)
{
int grade;
cin>>grade;
v[grade]++;
}
scanf("%d",&K);
int flag=0;
for(int i=0;i<K;i++)
{
int num;
scanf("%d",&num);
if(flag) printf(" ");
printf("%d",v[num]);
flag=1;
}
return 0;
}