解题思路: 我是这样理解的-----把第一次考试看作是第一课程的成绩,并且只考了一门,所以此时的排名名次是按照第一课程的成绩来排的-----第二次考试看作是第二课程的成绩,此时考了两门,那么这个时候的排名就得按照两门课程的总分来排-----那么第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 人评分
printf基础练习2 (有点不明白)浏览:845 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:1247 |
【蟠桃记】 (C语言代码)浏览:667 |
三角形 (C++代码)记忆化搜索浏览:1234 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:642 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:557 |
模拟计算器 (C语言代码)浏览:2301 |
1052题解(链表操作)浏览:674 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:573 |