PAT排名汇总
题目
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
struct stu
{
string id;
int place;
int score;
int rank;
int zrank;
}s[30010];
//输出须按最终排名的递增顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
//总结:分高的先输出,考号低的先输出
bool cmp(stu a, stu b)
{
if (a.score == b.score)
{
return a.id < b.id;
}
else
{
return a.score > b.score;
}
}
int main() {
int n, k;
int cnt=0, num=0;//下标:cnt 总学生:s
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> k;
num += k;
for (int j = 0; j < k; j++)
{
s[cnt].place = i + 1;
cin >> s[cnt].id >> s[cnt].score;
cnt++;
}
sort(s + (num - k), s + num, cmp);
int p = 1;
for (int i = num - k; i < num; i++)
{
if (s[i].score == s[i - 1].score && i >= 1) s[i].rank = s[i - 1].rank;
else s[i].rank = p;
p++;//无论if还是else,这句都要执行
}
}
//先把考场排名算出来,再重新算总排名
sort(s, s + num, cmp);
for (int i = 0; i < num; i++)
{
if (s[i].score == s[i - 1].score && i >= 1)
{
s[i].zrank = s[i - 1].zrank;
}
else
{
s[i].zrank = i + 1;
}
}
cout << num << endl;
for (int i = 0; i < num; i++)
{
cout << s[i].id << ' ' << s[i].zrank << ' ' << s[i].place<< ' ' << s[i].rank << endl;
}
}