25分题
排序原则:不论是各个考场排序还是总排序,都是按分数从高到低排,若分数相同,则排名相同,输出时id小的在前(该排序原则在sort第三个参数cmp中体现)
分组排序后再总排序
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct stu
{
string id;
int local;
int grade;
int local_rank;
int total_rank;
}v[30005];
bool cmp(stu a,stu b) //sort第三个参数,分数相同则id小排在前
{
if(a.grade!=b.grade)return a.grade>b.grade;
else return a.id<b.id;
}
int main()
{
int num_local,num_stu=0,i,j,k,x;
cin>>num_local;
for(i=0;i<num_local;i++)
{
cin>>x; //该考场人数
for(j=0;j<x;j++)
{
v[num_stu].local=i+1; //考场号
cin>>v[num_stu].id>>v[num_stu].grade;
num_stu++;
}
sort(v+num_stu-x,v+num_stu,cmp); //考场排序
v[num_stu-x].local_rank=1;
for(j=num_stu-x+1;j<num_stu;j++) //j从该考场第二名学生的下标开始
{
if(v[j].grade==v[j-1].grade)v[j].local_rank=v[j-1].local_rank; //如果和前一名同学分数一样,那么排名也一样
else v[j].local_rank=j+1-(num_stu-x);
}
}
cout<<num_stu<<endl;
sort(v,v+num_stu,cmp); //总排序
v[0].total_rank=1;
cout<<v[0].id<<" "<<v[0].total_rank<<" "<<v[0].local<<" "<<v[0].local_rank<<endl;
for(i=1;i<num_stu;i++)
{
if(v[i].grade==v[i-1].grade)v[i].total_rank=v[i-1].total_rank;
else v[i].total_rank=i+1;
cout<<v[i].id<<" "<<v[i].total_rank<<" "<<v[i].local<<" "<<v[i].local_rank;
if(i!=num_stu-1)cout<<endl;
}
return 0;
}