算法提高 班级排名

算法提高 班级排名

达达在陶陶的影响下,也对学习慢慢的产生了兴趣。他在每次考试之后,都会追着老师问,自己在班级的总名次是多少。考试一多,老师也不耐烦了,于是他给了达达所有人的成绩,让他自己去算出自己的排名。可人太多了,达达也无法立即算出来,于是他想让你帮帮他。

输入格式:

第一行为一个整数N,代表班级的学生总数。
接下来N行,每行一个字符串,代表一个学生的姓名,第一行总是DaDa。
接下来一行一个整数M,代表一共有M次考试。
每次考试有N行,每行有以一个空格分隔的一个正整数S和一个字符串P,代表名字为P的学生在这次考试中得了S分。

输出格式:

一共M行,每行一个整数,代表达达在班级里的排名,排名是这一次考试过后的所有考试总分排名,如果达达和别人并列,达达总是排在前面。

输入样例:

在这里给出一组输入。例如:

3
DaDa
A
B
2
49 DaDa
49 A
48 B
80 A
85 B
83 DaDa

输出样例:

在这里给出相应的输出。例如:

1
2

数据规模和约定 N <= 100,名字长度不超过30,分数不超过100

方法:

对于这种题,用结构体来写会方便很多,这道题花了不少时间,开始审题不够仔细,每次的排名是前面所有考试的总分,不是每次的分数。还有分数并列时要保证DaDa在前面,这里有个小技巧,可以在结构体里添加一个编号id,因为DaDa是最先输入的,可以保证DaDa的编号是最小的,分数相等时让编号再从小到大排列即可。(sort可以根据自定义的函数排序,实现起来比较容易)

代码:

#include
#include
#include
#include
using namespace std;
struct student
{
	string name;
	int sorce=0,id;
};
int cmp(student a, student b)
{
	if (a.sorce == b.sorce)//当分数相等时,编号小的排前面
		return a.id < b.id;
	return a.sorce > b.sorce;//分数不等,分高的排前面
}
int main()
{
	int n, m;
	cin >> n;
	vector<student>arr(n);
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i].name;
		arr[i].id = i;
	}
	string t;
	int sorce,cnt=0,s=1;
	cin >> m;
	for (int i = 0; i < m*n; i++)
	{
		cin >> sorce >> t;
		cnt++;
		for (int j = 0; j < arr.size(); j++)
		{
			if (arr[j].name == t)
			{
				arr[j].sorce += sorce;
				break;
			}
		}
		if (cnt == n)//输入n次,代表一次考试
		{
			s = 0;
			cnt = 0;
			sort(arr.begin(), arr.end(), cmp);//排序
			for (int j = 0; j < arr.size(); j++)
			{
				if (arr[j].name == "DaDa")
				{
					cout << j+1 << endl;
					break;
				}
			}
		}
	}
    return 0;
}

你可能感兴趣的:(蓝桥杯)