AcWing 1502. PAT 排名
原题链接
中等
作者:
goldstine
,
2021-07-17 12:25:32
,
所有人可见
,
阅读 282
题目描述
先对地区的分数进行排序记录,然后将所有学生加入优先队列
排序:分数相同排序相同,分数不同不是直接递增,而是按照前面学生的个数
通过两个变量 f_rank=r_rank=1;记录
通过f_rank++记录输出的学生个数,当相邻学生分数不相同时,通过f_rank跟新r_rank
算法1
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=30010;
struct student{
string registration_number;
int score;
int location_number;
int local_rank;
// bool operator <(const student &b) const{
// if(score==b.score){
// //字符串比较
// int p=registration_number.compare(b.registration_number);
// if(p<0){
// return false;
// }
// return true;
// }else{
// return score<b.score;
// }
// }
}stu[N];
bool operator <(student a,student b){
if(a.score==b.score){
//字符串比较
int p=a.registration_number.compare(b.registration_number);
if(p<0){
return false;
}
return true;
}else{
return a.score<b.score;
}
}
priority_queue<student> q;
int main(){
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
int k;
cin>>k;
sum+=k;
for(int j=1;j<=k;j++){
cin>>stu[j].registration_number>>stu[j].score;
stu[j].location_number=i;
}
sort(stu+1,stu+1+k);//按照分数从高到低进行排序
int rank=1;
stu[k].local_rank=rank;
q.push(stu[k]);
for(int j=k-1;j>=1;j--){
if(stu[j].score==stu[j+1].score){
stu[j].local_rank=stu[j+1].local_rank;
rank++;
}else{
stu[j].local_rank=++rank;
}
q.push(stu[j]);
}
}
cout<<sum<<endl;
int f_rank=1,r_rank=1;
student t=q.top();q.pop();
cout<<t.registration_number<<" "<<r_rank<<" "<<t.location_number<<" "<<t.local_rank<<endl;
student s=t;
while(q.size()){
student t=q.top();q.pop();
if(t.score==s.score){
cout<<t.registration_number<<" "<<r_rank<<" "<<t.location_number<<" "<<t.local_rank<<endl;
f_rank++;
}else{
cout<<t.registration_number<<" "<<++f_rank<<" "<<t.location_number<<" "<<t.local_rank<<endl;
r_rank=f_rank;
}
s=t;
}
return 0;
}