解题思路:
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;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复