我的解法:
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct student{
char id[14];
int scoreRange;
int testRoomId;
int testRoomRange;
float score;
};
bool cmp(student a,student b){ //按照成绩排名,相同成绩就按照学号排顺序
if (a.score!=b.score)return a.score>b.score;
else return strcmp(a.id,b.id)<0;
}
int main(){
int roomNum;
int totalNum=0;
cin>>roomNum;
student stu[30001];
for(int i=0;i<roomNum;i++){
int stuNum;
cin>>stuNum;
for(int j=0;j<stuNum;j++){
cin>>stu[totalNum].id>>stu[totalNum].score;
stu[totalNum].testRoomId=i+1;
totalNum+=1;
}
sort(stu+totalNum-stuNum,stu+totalNum,cmp);
for(int j=0;j<stuNum;j++){ //这里需要注意!考场内排名
if(j>0&&stu[totalNum-stuNum+j].score==stu[totalNum-stuNum+j-1].score){
stu[totalNum-stuNum+j].testRoomRange=stu[totalNum-stuNum+j-1].testRoomRange;
}else{
stu[totalNum-stuNum+j].testRoomRange=j+1;
}
}
}
cout<<totalNum<<endl;
sort(stu,stu+totalNum,cmp);
for(int i=0;i<totalNum;i++){
if(i>0&&stu[i].score==stu[i-1].score){
stu[i].scoreRange=stu[i-1].scoreRange;
}else{
stu[i].scoreRange=i+1;
}
cout<<stu[i].id<<" "<<stu[i].scoreRange<<" "<<stu[i].testRoomId<<" "<<stu[i].testRoomRange<<endl;
}
return 0;
}