老师想统计学生考试排名,假定一共有n名学生,学号为1至n。现按学号递增顺序给定每个学生的分数,请编写程序,帮助老师计算:对于每个学生,他的成绩比多少人高。假定考试满分为1000分,成绩均为整数。
输入格式:
输入第一行为1个整数n(0<n≤10 5),为学生人数。第二行为n个空格间隔的整数a1 a2…an表示学号1至n的学生的考试成绩。
输出格式:
输出n个整数b1 b2 ... bn,每个整数后一个空格,bi(1≤i≤n)表示比学生i成绩低的学生人数。
输入样例1:
5
80 10 20 20 30
输出样例1:
4 0 1 1 3
解释1:
a1=80,比4个人成绩高。
a2=10,比0个人成绩高。
a3=20,比1个人成绩高。
a4=20,比1个人成绩高。
a5=30,比3个人成绩高。
输入样例2:
9
10 20 30 40 50 60 70 80 90
输出样例2:
0 1 2 3 4 5 6 7 8
数据规模:
测试点0:n=10;
测试点1:n=100;
测试点2:n=1000;
测试点3−4:n=100000。
代码长度限制
16 KB
时间限制
60 ms
内存限制
64 MB
这里将会用到桶排序的方法,可具体了解后再进行解题
#include<stdio.h>
#include<stdlib.h>
#define max_std 1000001
#define max_score 1001
//应用到桶排序的方法
int stu[max_std]; //定义一个存储学生分数的数组
int score[max_score]; //定义一个记录分数出现次数的数组
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) //将学生i的分数读入stu数组
{
scanf("%d",&stu[i]);
score[stu[i]]++; //同时在score对相应的分数出现的次数加一
}
for(int i=1;i<=max_score;i++)
{
score[i]+=score[i-1]; //遍历,记录每个分数以下的其他分数出现的次数,
} //也就是记录每个分数以下的学生的人数
for(int i=1;i<=n;i++)
{
printf("%d ",score[stu[i]-1]);
/*由上一个for循环的操作可知:欲得到该比某分数低的人数为多少,只需得知
该分数减一的分数(该分数的上一个分数)出现的次数即可*/
}
}
(新手发文,仅供参考,代码存在不足)