解题思路:

typedef struct student{
 string name;
 int score;
}stu;

一个结构体,存名字和分数

按照题意输入成绩和姓名,成绩是累加的,在处理同分的情况,我们先完成每一次的输入后,进行降序排序

因为是结构体,需要自己写一个cmp的比较函数

bool cmp(stu a, stu b){
 return a.score > b.score;
}

sort函数原型

sort(排序数组的起始位置,排序数组的终止位置,比较函数)三个参数

sort函数包含在#include<algorithm>头文件中

还有,说一下,sort函数是对 [x,y)位置区间区间进行排序的

如sort(a+6,a+10)

这是对a[6]-a[9]之间的4个数排序

排序好之后,就需要来处理同分数的时候的排名了

就如 (我这里给分数后加一个d表示是DaDa)

 

100d 100 56 12 2 0

这里他是第一位,所以就是第一,输出1

89  78 78 78d 78 12 3 1,当是这种情况

他是排在第四位的

所以我们这样子来,先遍历到DaDa的位置,此时是第四名

然后判断他的上一个人是不是和他分数相同,是的话就名次-1,

DaDa是第四,他的上一位也是78,所以4-1=3

然后在3的位置,继续判断上一个是不是

DaDa的名次现在是第三了,判断后,第二名也和他分数一样,名字再次-1

现在DaDa名次是第二了,接着判断第一位和他一样分数不,很明显不一样,就直接退出循环


注意事项:

是总分,是总分,是总分....当时我也被坑了好几次.......就是每一次输入的成绩是累加的,累加后的每一次来排名的........

参考代码:

#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<functional>
#include<map>
#include<math.h>

typedef struct student{
        string name;
        int score;
}stu;
stu s[150];
bool cmp(stu a, stu b){
      return a.score > b.score;
}
int main(){
           int n, m;
           cin >> n;
           for (int i = 1; i <= n; i++)cin >> s[i].name;
           cin >> m;
           while (m){
                           int snum;
                           string sname;
                           for (int i = 1; i <= n; i++){
                                         cin >> snum;
                                         cin >> sname;
                                          for (int j = 1; j <= n; j++){
                                                       if (sname == s[j].name){
                                                                  s[j].score += snum; break;
                                                        }
                                           }
                            }
                            sort(s + 1, s + 1+n,cmp);
                            for (int i = 1; i <= n; i++){
                                          if (s[i].name == "DaDa"){
                                          while (s[i].score == s[i - 1].score){
                                                           i--;
                                           }
                                            cout << i << endl;
                                            break;
                                           }
                            }
                            m--;
            }
           return 0;
}

点赞(12)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

zy 5年前 回复TA
你少写了using namespace std;