原题:https://pintia.cn/problem-sets/15/problems/888
思路:
创建一个结构体,里面包含每个考生的各种信息:姓名,成绩,分区排名,最终排名,地区
struct stu {
string name;
int score,place,Sum_rank,zone_rank;
}List[MAXSIZE];
排序分成三步:
第一步,对分区学生按照成绩高低进行排名,同时将排名记录进该考试信息中;
第二步,对所有考生按照成绩高低进行排名,同时将排名记录进该考试信息中;
第三步,对所有考生按照总地区的排名进行排序,如果出现并列的则按小学号排序;
完成第三步之后直接按顺序输出即可;
#include<iostream>
#include<algorithm>
#include<string>
#define MAXSIZE 30010
using namespace std;
struct stu {
string name;
int score,place,Sum_rank,zone_rank;
}List[MAXSIZE];
bool cmp(stu a, stu b) { return a.score > b.score; }
bool cmp1(stu a, stu b)
{
return a.Sum_rank != b.Sum_rank ? a.Sum_rank < b.Sum_rank : a.name < b.name;
}
int main()
{
int n, cnt = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int k;
struct stu stus[300];
scanf("%d", &k);
for (int j = 0; j < k; j++)
{
cin >> stus[j].name>>stus[j].score;
stus[j].place = i;
}
sort(stus, stus + k, cmp);
//开始处理分区排名,并且处理并列的那些排名
for (int j = 0; j < k; j++)
{
int p = j;
if (stus[j - 1].score == stus[j].score && j >= 1) {
while (stus[p - 1].score == stus[p].score && p >= 1)p--;
}
stus[j].zone_rank = p + 1;
List[cnt++] = stus[j];//存储到总表之中
}
}
sort(List, List + cnt,cmp);//对总表进行排名,并且处理并列的排名
for (int j = 0; j < cnt; j++)
{
int p = j;
if (List[j - 1].score == List[j].score && j >= 1) {
while (List[p - 1].score == List[p].score && p >= 1)p--;
}
List[j].Sum_rank = p+1;
}
sort(List, List + cnt, cmp1);
cout << cnt << endl;
for (int i = 0; i < cnt; i++)
{
cout << List[i].name << " " << List[i].Sum_rank << " " << List[i].place << " " << List[i].zone_rank << endl;
}
return 0;
}