题目链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872
题目分析:
排序问题。
需要得到两个排名,总排名,以及考场内排名。
考场内排名可以在输出该考场信息后得到,当所有考生信息输入后得到最后各个考生的总排名。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k; // n考生总数,k单个考场考生数
struct node{
string name;
int score, fin_rank, loc_num, loc_rank; // 得分,总排名,考场编号,考场内部排名
}pre[30005];
bool cmp(node a,node b){
return a.score !=b.score ? a.score >b.score : a.name <b.name ;
}
int main(){
cin>>n;
int len=0;
//输入数据,len记录当前考生数
for(int i=0;i<n;i++){
cin>>k;
for(int j=0;j<k;j++){
cin>>pre[len].name >>pre[len].score ;
pre[len].loc_num =i+1;
len++;
}
//对同组的进行处理,得到考场排名loc_rank
sort(pre+len-k,pre+len,cmp);
pre[len-k].loc_rank = 1;
for(int j=len-k+1;j<len;j++){
if(pre[j].score ==pre[j-1].score ) pre[j].loc_rank =pre[j-1].loc_rank ;
else pre[j].loc_rank =j-(len-k)+1;
}
}
//最终排名
sort(pre,pre+len,cmp);
pre[0].fin_rank =1;
for(int i=1;i<len;i++){
if(pre[i].score ==pre[i-1].score ) pre[i].fin_rank =pre[i-1].fin_rank ;
else pre[i].fin_rank =i + 1;
}
//输出结果
cout<<len<<endl;
for(int i=0;i<len;i++){
cout<<pre[i].name <<" "<<pre[i].fin_rank <<" "<<pre[i].loc_num <<" "<<pre[i].loc_rank <<endl;
}
}