PAT考完之后要排名。先把各个考场排名,再合并起来。
先对每个考场排名,存入信息结构体中。
再将所有记录放入一个容器中进行总排,排名rank的计数逻辑是相同的。
#include <bits/stdc++.h>
using namespace std;
const int N = 128, K = 310;
typedef long long ll;
struct info
{
char reg[15];
int grade;
int fin_rank;
int loc_num;
int loc_rank;
};
vector<info> testee[N], ans;
bool cmp_grade(const info &a, const info &b)
{
return a.grade > b.grade;
}
bool cmp(const info &a, const info &b)
{
if (a.grade != b.grade)
return a.grade > b.grade;
else
return strcmp(a.reg, b.reg) <= 0;
}
int main()
{
int n;
scanf("%d", &n);
int k;
for (int i = 1; i <= n; i++)
{
scanf("%d", &k);
testee[i].resize(k);
for (int j = 0; j < k; j++)
{
testee[i][j].loc_num = i;
scanf("%s%d", testee[i][j].reg, &testee[i][j].grade);
}
sort(testee[i].begin(), testee[i].end(), cmp_grade);
int rank = 0, temp_rank = 0, temp_grade = 9999;
for (int j = 0; j < k; j++)
{
temp_rank++;
if (testee[i][j].grade < temp_grade)
{
rank = temp_rank;
temp_grade = testee[i][j].grade;
}
testee[i][j].loc_rank = rank;
}
}
for (int i = 1; i <= n; i++)
for (int j = 0; j < testee[i].size(); j++)
ans.push_back(testee[i][j]);
printf("%d\n", ans.size());
sort(ans.begin(), ans.end(), cmp);
int rank = 0, temp_rank = 0, temp_grade = 9999;
for (int i = 0; i < ans.size(); i++)
{
temp_rank++;
if (ans[i].grade < temp_grade)
{
rank = temp_rank;
temp_grade = ans[i].grade;
}
printf("%s %d %d %d\n", ans[i].reg, rank, ans[i].loc_num, ans[i].loc_rank);
}
system("pause");
return 0;
}