描述

ACM俱乐部是一个非常好的平台,每个学校都可以来申请拥有属于自己的OJ,并且实现了题目共享和出售,使题目资源不足的问题在很大程度上得到了改善。
作为一个OJ,排名系统是一定要有的。假设ACM俱乐部对用户的排名规则如下:
先按照分数从高到低排序,如果分数一样,则按照AC题目数从多到少排序,如果AC题目数也一样,则按照用户名缩写的字典序排序,如果用户名缩写字典序也相同,则按照用户名的字典序排序。
用户名由若干单词组成,每个单词只包含小写英文字母,且由至少一个英文字母组成,单词之间由一个空格分隔。
用户名的缩写由每个单词首字母组成,例如“tian qin”的缩写是“tq”。
按照用户名字典序进行排序时,用户名中的空格应忽略,例如应将“tian qin”转换成“tianqin”,再进行排序。

输入

输入包含多组测试数据。 每组输入的第一行是一个整数N(0<=N<=100),表示用户数量。当N=0时,输入结束。 
接下来N行,每行先输入两个整数a和b(0<=a,b<=1000),a表示分数,b表示AC题数,然后在同一行输入一个字符串s,表示用户名,s的长度不大于15。a,b,s三者由一个空格分隔。 
输入数据保证不会出现用户名相同的情况,也不会出现a!=0,而b=0的情况。

输出

对于每组输入,输出排好序的用户信息,一个用户信息占一行,格式与输入时一致。相邻两组输出之间空一行。

样例输入1

2
98 45 tian qin
100 40 acm club
3
88 50 tian qin
88 45 acm club
88 50 tai qiu
0

样例输出1

100 40 acm club
98 45 tian qin

88 50 tai qiu
88 50 tian qin
88 45 acm club

#include <iostream>
#include <string.h>
using namespace std;
class Student {   //学生类
	public:
		int mark;
		int proNum;
		char printName[20];   //用于打印
		char shortName[20];   //缩写
		char longName[20];    //去空格

		void getMessege()
		{
			cin >> mark >> proNum;
			getchar();
			char tmp;
			int count[3] = {0};
			while ((tmp = getchar()) != '\n')
			{
				printName[count[0]++] = tmp;
				if (count[1] == 0 || printName[count[0]-2] == ' ')
					shortName[count[1]++] = tmp;
				if (tmp != ' ')
					longName[count[2]++] = tmp;
			}
			printName[count[0]] = '\0';
			shortName[count[1]] = '\0';
			longName[count[2]] = '\0';
		}
		
		bool compare(Student &s)
		{
			if (mark < s.mark)
				return true;
			else if (mark > s.mark)
				return false;
			if (proNum < s.proNum)
				return true;
			else if (proNum > s.proNum)
				return false;
			if (strcmp(shortName, s.shortName) > 0)
				return true;
			else if (strcmp(shortName, s.shortName) < 0)
				return false;
			if (strcmp(longName, s.longName) > 0)
				return true;
			return false;
		}
};

int main()
{
	int N;
	bool flag = false;
	while ((cin >> N) && N)
	{
		if (flag)
			cout << endl;
		Student student[100];
		for (int i = 0; i < N; i++)
			student[i].getMessege();
		for (int i = 0;i < N-1; i++)
		{
			for (int j = i+1; j < N; j++)
			{
				if (student[i].compare(student[j]))
				{
					Student tmp = student[i];
					student[i] = student[j];
					student[j] = tmp;
				}
			}
		}
		for (int i = 0; i < N; i++)
			printf("%d %d %s\n", student[i].mark, student[i].proNum, student[i].printName);
		flag = true;
	}
}


点赞(4)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论