私信TA

用户名:2950870451

访问量:25676

签 名:

等  级
排  名 197
经  验 6587
参赛次数 0
文章发表 77
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路: 我是这样理解的-----把第一次考试看作是第一课程的成绩,并且只考了一门,所以此时的排名名次是按照第一课程的成绩来排的-----第二次考试看作是第二课程的成绩,此时考了两门,那么这个时候的排名就得按照两门课程的总分来排-----那么第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 人评分

  评论区

  • «
  • »