解题思路: 我是这样理解的-----把第一次考试看作是第一课程的成绩,并且只考了一门,所以此时的排名名次是按照第一课程的成绩来排的-----第二次考试看作是第二课程的成绩,此时考了两门,那么这个时候的排名就得按照两门课程的总分来排-----那么第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分
2 人评分
点我有惊喜!你懂得!浏览:2754 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:744 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1090 |
C语言程序设计教程(第三版)课后习题9.3 (Java代码)浏览:1025 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:561 |
母牛的故事 (C语言代码)浏览:992 |
有关字符,字符串的输入输出函数说明浏览:498 |
DNA (C语言代码)浏览:798 |
Tom数 (C语言代码)浏览:517 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |