注意:在写cmp函数时,按照c语言的写法,应该用strcmp来进行大小比较,如果直接用>或<会出错。
bool cmp(const Node &a,const Node &b){
if(a.score==b.score) return strcmp(a.id,b.id)<0;
return a.score>b.score;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e4+10;
struct Node{
char id[15];//表示ID
int score;//表示总分
int group;//表示组号
int final_rank;//最后的排名
int local_rank;//小组排名
};
Node p[maxn];
bool cmp(const Node &a,const Node &b){
if(a.score==b.score) return strcmp(a.id,b.id)<0;
return a.score>b.score;
}
int main()
{
int n,k;
scanf("%d",&n);
int cnt=0,rank=1;
for(int i=1;i<=n;i++){
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%s %d",p[cnt].id,&p[cnt].score);
p[cnt++].group=i;
}
sort(p+cnt-k,p+cnt,cmp);
p[cnt-k].local_rank=1;
rank=1;
for(int j=cnt-k+1;j<cnt;j++){
++rank;
if(p[j].score==p[j-1].score){
p[j].local_rank=p[j-1].local_rank;
}else{
p[j].local_rank=rank;
}
}
}
sort(p,p+cnt,cmp);
p[0].final_rank=1;
rank=1;
for(int i=1;i<cnt;i++){
++rank;
if(p[i].score==p[i-1].score){
p[i].final_rank=p[i-1].final_rank;
}else{
p[i].final_rank=rank;
}
}
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
printf("%s %d %d %d\n",p[i].id,p[i].final_rank,p[i].group,p[i].local_rank);
}
return 0;
}