1025 PAT Ranking

Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive number N (≤100), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (≤300), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.

Output Specification:

For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:

registration_number final_rank location_number local_rank

The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.

Sample Input:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

Sample Output:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

 

编程能力测试(PAT)由浙江大学计算机科学与技术学院主办。每个测试应该在多个地方同时运行,排名列表将在测试后立即合并。现在,您的工作是编写一个程序来正确合并所有排名列表并生成最终排名。   

输入规范:每个输入文件包含一个测试用例。对于每种情况,第一行包含一个正数 N (≤100),即测试位置的数量。然后是 N 个排名列表,每个排名列表都以包含正整数 K (≤300)、受测人数的行开头,然后是包含注册号(13 位数字)和每个测试者总分的 K 行。一行中的所有数字都用空格分隔。   

输出规范:对于每个测试用例,首先在一行中打印测试者的总数。然后按以下格式打印最终排名列表: registration_number final_rank location_number local_rank 位置的编号从 1 到 N。输出必须按最终排名的非降序排序。分数相同的受测者必须具有相同的排名,并且输出必须按其注册号的非降序排序。


AC+解析

#include
#include
#include
#include
#include
#include
using namespace std;

struct node
{
	string id;
	int mark;
	int final_rank,location_number,local_rank;
};


bool operator<(const node& r1, const node& r2)
{
	if (r1.mark > r2.mark)
		return true;
	else if (r1.mark == r2.mark)
		return r1.id < r2.id;
	else
		return false;
	
}
//如果容器元素是用户定义的对象,则要使用sort(),
//必须定义能够处理该类型对象的 operator<() 函数。

vectorstu[110];
//因为要排序,才能得知排名
//创建这个stu就是为了得到在组中排序的结果,然后再插入回fRank
//因为后面的结果都要对应一个id,方便输出就必须要统一在一个容器中得出全部的结果
//也就是说stu只是为了得出当前组中的排名,为了给fRank赋值的!
vectorfRank;




int main()
{
	int n, k;
	cin >> n;
	for (int i = 0; i> k;
		node x;
		for (int j = 0; j < k; j++)
		{
			cin >> x.id >> x.mark;
			x.location_number = i+1;
			stu[i].push_back(x);
			//fRank.push_back(x);//总排名的所有数据  err
			//放后面点再插入
		}
	}
	
	
	for (int i = 0; i < n; i++)
	{
sort(stu[i].begin(), stu[i].end());
stu[i][0].local_rank = 1;//初始化开头的排名,为了下面相同排名的继承
fRank.push_back(stu[i][0]);//插入写好地区排名的数据到fRank
int k = 2;//表示排名
for (int j = 1; j < stu[i].size(); j++)
{
	if (stu[i][j-1].mark == stu[i][j].mark)
	{
		stu[i][j].local_rank = stu[i][j-1].local_rank;
		fRank.push_back(stu[i][j]);
		k++;
		
	}
	else
	{
		stu[i][j].local_rank = k;
		fRank.push_back(stu[i][j]);
		k++;
	}
	
}
}

	//总排名
	//如何将两个容器的全部数据合并呢?
	//算了没必要,就多插入一个容器的数据吧也没啥

	sort(fRank.begin(), fRank.end());
	fRank[0].final_rank = 1;//初始化开头的排名,为了下面相同排名的继承
	  k = 2;//表示排名
	for (int j = 1; j < fRank.size(); j++)
	{
		if (fRank[j - 1].mark == fRank[j].mark)
		{
			fRank[j].final_rank = fRank[j - 1].final_rank;

			k++;

		}
		else
		{
			fRank[j].final_rank = k;
			k++;
		}

	}

	//输出
	cout << fRank.size() << endl;
	//如何输出对应id的地区排名?
	//不要在一开始插入,而是等地区排名的结果更新后再插入到fRank中
	//先把数据写好,在插入,就能很好的统一所有数据直接输出
	//不要先插入再改,不然很麻烦!

	for (int i = 0; i < fRank.size(); i++)
	{
		cout << fRank[i].id << " " << fRank[i].final_rank << " "
			<< fRank[i].location_number << " " << fRank[i].local_rank << endl;
	}

	


	return 0;
}

你可能感兴趣的:(算法)