原题链接:蓝桥杯算法提高VIP-班级排名
解题思路: 我是这样理解的-----把第一次考试看作是第一课程的成绩,并且只考了一门,所以此时的排名名次是按照第一课程的成绩来排的-----第二次考试看作是第二课程的成绩,此时考了两门,那么这个时候的排名就得按照两门课程的总分来排-----那么第M次考试也就相当于是把所有的课程全部考完了,然后拿这个全部课程的总分来排的。
注意事项: 千万不要理解错题意了QWQ,要输出的是DaDa总分的排名名次,不是每次考试所得分的排名名次。
参考代码:
#include <stdio.h>
#include <string.h>
struct stu{
char name[35];
int score;
int sum;
}Stu[100];
int main(){
char name[100][35];
int flag[10001];
int N,M;
int C; //名次
int i,j,k,q;
scanf("%d", &N);
for(i = 0; i < N; i++) //读入N个姓名,后续可以拿它来找姓名
scanf("%s", name[i]);
scanf("%d", &M);
for(i = 0; i < M; i++){
C = 1;
memset(flag,0,sizeof(flag)); //因为这里用的是桶排,所以需要每次给flag数组做初始化
for(j = 0; j < N; j++){
scanf("%d %s", &Stu[j].score,Stu[j].name);
for(k = 0; k < N; k++){ //找对应的姓名的下标,这样就不会造成成绩加错的问题
if(!strcmp(Stu[j].name,name[k]))
break;
}
Stu[k].sum += Stu[j].score; //累加当前这个学生的成绩
flag[Stu[k].sum]++;
}
for(j = 10000; j >= 0; j--){
if(flag[j] > 0){ //该总分出现过
for(k = 0; k < N; k++){
if(strcmp(Stu[k].name,"DaDa") == 0){ //找到"DaDa",因为我们要输出的是"DaDa"的名次
for(q = 0; q < N; q++){ //找到"DaDa"所对应的总分的下标
if(strcmp("DaDa",name[q]) == 0)
break;
}
if(Stu[q].sum == j){ //"DaDa"的总分与当前总分相等
printf("%d\n", C);
C = -1; //找到了
break; //因为不考虑重名的情况,所以此时就可以break了
}
}
}
if(C == -1) //找到了
break;
for(k = 0; k < flag[j]; k++)
C++; //因为总分是按降序来遍历的,所以C++
}
}
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复