解题思路:
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 人评分
A+B for Input-Output Practice (IV) (C语言代码)浏览:551 |
简单的a+b (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题9.8 (Java代码)浏览:1674 |
【绝对值排序】 (C语言代码)浏览:832 |
这可能是一个假的冒泡法浏览:1071 |
【出圈】 (C语言代码)浏览:824 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:909 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:400 |
【金明的预算方案】 (C++代码)浏览:873 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:600 |