排名的时候分数相同的名次相同,1 2 2 4类似这样,对排名的处理为
if(stu[j].score==stu[j-1].score) stu[j].lrank=stu[j-1].lrank;
else stu[j].lrank=max(stu[j-1].lrank+1,j-cnt+1);
每个考场排序的时候用[cnt,cnt+k)来确定该考场的学生下标
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int N=3e4+10;
struct student
{
string id;
int score;
int room;
int lrank;
int grank;
}stu[N];
bool cmp1(student a,student b)
{
if(a.score==b.score)
return a.id<b.id;
else return a.score>b.score;
}
int n;
int cnt=1;
int sum=0;
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
int k;
cin>>k;
sum+=k;
for(int j=cnt;j<cnt+k;++j) //[cnt,cnt+k)总共k个
{
stu[j].room=i;
cin>>stu[j].id>>stu[j].score;
}
sort(stu+cnt,stu+cnt+k,cmp1);
stu[cnt].lrank=1;
for(int j=cnt+1;j<cnt+k;++j)
{
if(stu[j].score==stu[j-1].score) stu[j].lrank=stu[j-1].lrank;
else stu[j].lrank=max(stu[j-1].lrank+1,j-cnt+1);
// stu[j].lrank=max(j-cnt+1,stu[j].lrank); //第二位是j=cnt+1 2=j-cnt+1
//cout<<stu[j].lrank;
}
//cout<<endl;
cnt=cnt+k;
}
sort(stu+1,stu+1+sum,cmp1);
stu[1].grank=1;
for(int j=2;j<=sum;++j)
{
if(stu[j].score==stu[j-1].score) stu[j].grank=stu[j-1].grank;
else stu[j].grank=max(stu[j-1].grank+1,j);
//stu[j].grank=max(j,stu[j].grank);
}
cout<<sum<<endl;
for(int i=1;i<=sum;++i)
{
cout<<stu[i].id<<' '<<stu[i].grank<<' '<<stu[i].room<<' '<<stu[i].lrank<<endl;
}
return 0;
}