PTA--数据结构预习报告: 考试排名汇总

A3.
PAT 考试排名汇总 (☆☆)
【题目描述】PTA(数据结构与算法题目集 7-41)
计算机程序设计能力考试(Programming Ability Test,简称 PAT)旨在通过统一组织的在线考试及
自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,
为企业选拔人才提供参考标准。每次考试会在若干个不同的考点同时举行,每个考点用局域网,产
生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。现在就请你写一个
程序自动归并各个考点的成绩并生成总排名表。
【输入格式】
输入的第一行给出一个正整数 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
【输出样例】 4
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
二,问题分析
排序问题
选择基准值:通常选择序列的第一个或最后一个元素作为基准值。

分区操作:重新排列序列,使得所有小于或等于基准值的元素都移到基准的左边,而所有大于基准值的元素都移到基准的右边。这一步完成后,基准值所在的位置就是其最终位置。

递归排序:递归地将小于基准值的子序列和大于基准值的子序列再次进行快速排序。

简而言之,就是将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值。再对左右两子序列分别递归排序。
三,源代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int N,k,S=0,ptr = 0;
struct stu
{
string number;
int point;
int rank1;
int mark;
int rank2;
};
stu T[30005];

bool cmp(stu a,stu b)
{
if(a.point > b.point){
return true;
}
else if(a.point == b.point && a.number < b.number){
return true;
}
return false;
}

void distribute(int k,int flag = 0)
{
if(!flag){
for(int i=1;i <= k;i++){
if(i > 1 && T[ptr].point == T[ptr-1].point){
T[ptr].rank2 = T[ptr-1].rank2;
++ptr;
}
else
T[ptr++].rank2 = i;
}
}
else{
for(int i=0;i < k;i++){
if(i > 0 && T[i].point == T[i-1].point){
T[i].rank1 = T[i-1].rank1;
}
else
T[i].rank1 = i+1;
}
}
}

void ouput()
{
printf("%d\n",S);
for(int i=0;i < S;i++){
printf("%s %d %d %d\n",T[i].number.c_str(),T[i].rank1,T[i].mark,T[i].rank2);
}
}
void input()
{
int v=0;
for(int i=0;i < N;i++){
string number;
int point;
cin >> k;
S += k;
for(int j=0;j < k;j++){
cin >> number >> point;
T[v].number = number;
T[v].mark = i+1;
T[v++].point = point;
}
sort(T+S-k,T+S,cmp);
distribute(k);
}
sort(T,T+v,cmp);
distribute(v,1);
}
int main()
{
cin >> N;
input();
ouput();
return 0;
}

相关推荐
浅念-7 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
im_AMBER9 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
如君愿10 小时前
考研复习 Day 30 | 习题--计算机网络 第五章(运输层 上)、数据结构 图(上)
数据结构·计算机网络·课后习题
weixin_4217252610 小时前
C语言中volatile关键字怎么用C语言volatile在多线程中的作用
c语言·数据结构·运算符优先级·变量命名·volatile关键字
05候补工程师11 小时前
【408 从零到一】线性表逻辑特征、存储结构对比与 C/C++ 动态内存分配避坑指南
c语言·开发语言·数据结构·c++·考研
努力努力再努力wz12 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql
炸膛坦客13 小时前
嵌入式 - 数据结构与算法:(1-4)数据结构 - 单链表的两个核心缺点(引入循环/双向链表)
c语言·数据结构·链表
Hesionberger13 小时前
LeetCode 78:子集生成全攻略
java·开发语言·数据结构·python·算法·leetcode·职场和发展
上弦月-编程15 小时前
高效编程利器:转移表技术解析
c语言·开发语言·数据结构·算法·排序算法
薇茗15 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树2
c语言·数据结构·算法·二叉树