原题链接:蓝桥杯算法提高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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复