这题给出了(PAT)的排名规则
在结构体类型中存放题目要求的信息(准考证号、分数、考场号以及考场内排名)。
根据题目要求,需要写一个排序函数cmp,规则如下:
- 当分数不同时,按分数从大到小排序。
- 否则,按准考证号从小到大排序。
而算法本体则分为下面三个部分:
- 按考场读入各考生的信息,并对当前读入考场的所有考生进行排序。之后将该考场的所有考生的排名写入他们的结构体中。
- 对所有考生进行排序,计算总排名。
- 输出所有考生的信息。
const int N=30010;
struct Node {
string id;
int score;
int final_rank;
int local_number;
int local_rank;
}a[N];
int n,k;
bool cmp(Node &a, Node &b)
{
if(a.score == b.score) return a.id < b.id;
return a.score > b.score;
}
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin>>k;
int l=cnt;
for(int j=0;j<k;j++)
{
cin>>a[cnt].id>>a[cnt].score;
a[cnt].local_number=i;
cnt++;
}
int r=cnt;
sort(a+l,a+r,cmp);
int local_rank=1;
for(int i=l;i<r;i++)
{
if(i > l && a[i].score == a[i-1].score)
a[i].local_rank = a[i-1].local_rank;
else a[i].local_rank = local_rank;
local_rank++;
}
}
cout<<cnt<<endl;
sort(a,a+cnt,cmp);
int final_rank=1;
for(int i=0;i<cnt;i++)
{
if(i && a[i].score == a[i-1].score)
a[i].final_rank = a[i-1].final_rank;
else a[i].final_rank = final_rank;
final_rank++;
}
for(int i=0;i<cnt;i++)
cout<<a[i].id<<' '<<a[i].final_rank<<' '<<a[i].local_number<<' '<<a[i].local_rank<<endl;
//system("pause");
return 0;
}
(update on 2021.2.14)
作了略微的修改:
const int N=30010;
struct Node {
string id;
int score;
int final_rank;
int local_number;
int local_rank;
bool operator<(const Node &W) const
{
if(score == W.score) return id < W.id;
return score > W.score;
}
}a[N];
int n,k;
int main()
{
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
cin>>k;
int l=cnt;
for(int j=0;j<k;j++)
{
cin>>a[cnt].id>>a[cnt].score;
a[cnt].local_number=i;
cnt++;
}
int r=cnt;
sort(a+l,a+r);
for(int j=l;j<r;j++)
{
if(j > l && a[j].score == a[j-1].score)
a[j].local_rank = a[j-1].local_rank;
else a[j].local_rank = j-l+1;
}
}
cout<<cnt<<endl;
sort(a,a+cnt);
for(int i=0;i<cnt;i++)
{
if(i && a[i].score == a[i-1].score)
a[i].final_rank = a[i-1].final_rank;
else a[i].final_rank = i+1;
}
for(int i=0;i<cnt;i++)
cout<<a[i].id<<' '<<a[i].final_rank<<' '<<a[i].local_number<<' '<<a[i].local_rank<<endl;
//system("pause");
return 0;
}