排名

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40761693/article/details/88203602

7-12 排排排名 (25 分)

众所周知,Keven所在的集训队经常举办比赛,然而每次比赛的排名统计是一个大麻烦,于是Keven找到了你并给了你这次比赛的分数,希望你能帮他统计一下这次比赛前K名队员的排名。

输入格式:

输入在第一行给出 2 个整数,分别是 N(不超过 10 000 的正整数,为学生总数)、K(不超过 100 且不超过 N 的正整数)。接下来 N 行,每行给出一位学生的账号(长度不超过15位、不带空格的字符串)和比赛成绩(区间 [0, 100] 内的整数),其间以空格分隔。题目保证没有重复的账号。

输出格式:

然后按总评成绩非升序输出前K名学生的名次、账号和成绩,其间以 1 个空格分隔。需要注意的是:成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。

需要注意的是:

成绩相同的学生享有并列的排名,排名并列时,按账号的字母序升序输出。详见第二个样例。

假设现在有三位同学,他们的成绩分别是100、100、80,那么此时两位100分的同学的排名应该都是 1 ,并且80分的同学的排名是 3 。

输入样例1:

10 5
cy@zju.edu.cn 78
cy@pat-edu.com 87
1001@qq.com 65
uh-oh@163.com 96
test@126.com 39
anyone@qq.com 87
zoe@mit.edu 80
jack@ucla.edu 88
bob@cmu.edu 80
ken@163.com 70

输出样例1:

1 uh-oh@163.com 96
2 jack@ucla.edu 88
3 anyone@qq.com 87
3 cy@pat-edu.com 87
5 bob@cmu.edu 80
5 zoe@mit.edu 80

输入样例2:

5 1
cy@zju.edu.cn 100
cy@pat-edu.com 100
1001@qq.com 100
uh-oh@163.com 96
test@126.com 39

输出样例2:

1 1001@qq.com 100
1 cy@pat-edu.com 100
1 cy@zju.edu.cn 100

emmm当时没有想到字符串按升序排列的话要怎么排。。用compare函数。

/*排名*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{
	int number;
	string name;
	int score;
}stu[10001];
bool compare(struct node a ,struct node b)
{
	if(a.score==b.score)
		return a.name.compare(b.name)<0;//比较两个字符串的大小,如果a.name>b.name > 0这里要求升序排列 
	else
		return a.score>b.score;
}
int main()
{
	int i,n,m,temp = 1;
	cin>>n>>m;
	for(int i = 0;i < n;i++)
	{
		cin>>stu[i].name>>stu[i].score;
	}
	sort(stu,stu+n,compare);
	stu[0].number = 1;
	for(i = 1;i < n;i++)
	{
		if(stu[i].score==stu[i-1].score)
		{
			stu[i].number = stu[i-1].number;
			temp++;
		}
		else
		{
			stu[i].number = stu[i-1].number+temp;
			temp = 1;
		}
	}
	for(i = 0;i < n;i++)
	{
		if(stu[i].number<=m)
		{
			cout<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].score<<endl;
		}
	}
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页