数据结构与算法题目集(中文)7-41 PAT排名汇总 (25分) (sort 数组中分阶段排序)
1.题目
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。
每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。
现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入格式:
输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出格式:
首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出样例:
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
2.题目分析
1. 开始设计了两个结构体,一个放考场的,排序完成后再去排整个全部考生,但是代码冗余突破天际
2.只用一个结构体,灵活使用num在数组中进行阶段性的一块一块滚动
3.代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
struct stu
{
string stunumber;//总出错的原因是这里使用了long long 而没有使用string!!!!!!!!!
int grade;
int classroomnumber;
int finalrank;
int classroomrank;
}list[30001];
bool cmp(stu&s1, stu&s2)
{
if (s1.grade != s2.grade)
return s1.grade > s2.grade;
else
return s1.stunumber < s2.stunumber;
}
int main()
{
int classcount = 0;
int totalstuamount = 0;//总学生人数
cin >> classcount;
int num = 0;
for (int i = 1; i <= classcount; i++)
{
int classamount;
cin >> classamount;
for (int j = num; j < num+classamount; j++)//获取该考场的考试信息
{
int b;
string a;
cin >> a >> b;
list[j].classroomnumber = i;
list[j].stunumber = a;
list[j].grade = b;
totalstuamount++;
}
sort(list+num, list +num+ classamount, cmp);//考场中的排名排序
list[num].classroomrank = 0;
for (int j = num+1; j <num+classamount; j++)//记录考场中的排名
{
if (list[j].grade != list[j - 1].grade)
list[j].classroomrank = j-num;
else
list[j].classroomrank = list[j - 1].classroomrank;
}
num += classamount;
}
sort(list, list+totalstuamount, cmp);//所有学生排名
list[0].finalrank = 0;
for (int i = 1; i < totalstuamount; i++)
{
if (list[i].grade != list[i - 1].grade)
{
list[i].finalrank = i;
}
else
list[i].finalrank = list[i - 1].finalrank;
}
cout << totalstuamount << endl;
for (int i=0;i<totalstuamount;i++)
{
cout << list[i].stunumber << " " << list[i].finalrank + 1 << " " <<list[i].classroomnumber << " " <<list[i].classroomrank + 1 << endl;
}
}