题目描述
思路
stu[ ]存放结构体数组,loc_num[ ]存放每个考场的人数,loc_end_pos[ ]记录
每个考场最后一个位置在stu中下标位置(用于每个考场sort)先逐个考场sort,最后整体sort
大坑在于id的比大小:
直接a.id<b.id会出问题,devC++能过,但是PAT官网不能过,使用strcmp(a.id,b.id)<0就没问题
代码
#include<bits/stdc++.h>
using namespace std;
struct student{
char id[15];
int score;
int location_rank;
int whole_rank;
int location_number;
};
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 n;
cin>>n;
int loc_num[n];
struct student stu[30000];
int cur_pos=0;
int pos=0;
for(int i=0;i<n;i++)
{
cin>>loc_num[i];
while(cur_pos++<loc_num[i])
{
cin>>stu[pos].id>>stu[pos].score;
stu[pos].location_number=i+1;
pos++;
}
cur_pos=0;
}
int loc_end_pos[n];
for(int i=0;i<n;i++)
{
if(i==0)
loc_end_pos[i]=loc_num[i];
else
{
loc_end_pos[i]=loc_end_pos[i-1]+loc_num[i];
}
}
for(int i=0;i<n;i++)
{
if(i==0)
{
sort(stu,stu+loc_end_pos[i],cmp);
for(int j=0;j<loc_end_pos[i];j++)
{
stu[j].location_rank=j+1;
if(stu[j-1].score==stu[j].score && j-1>=0)
{
stu[j].location_rank=stu[j-1].location_rank;
}
}
}
else
{
sort(stu+loc_end_pos[i-1],stu+loc_end_pos[i],cmp);
for(int j=loc_end_pos[i-1];j<loc_end_pos[i];j++)
{
stu[j].location_rank=j-loc_end_pos[i-1]+1;
if(stu[j-1].score==stu[j].score && j-1>=0)
{
stu[j].location_rank=stu[j-1].location_rank;
}
}
}
}
sort(stu,stu+loc_end_pos[n-1],cmp);
for(int i=0;i<loc_end_pos[n-1];i++)
{
stu[i].whole_rank=i+1;
if(stu[i-1].score==stu[i].score && i-1>=0)
{
stu[i].whole_rank=stu[i-1].whole_rank;
}
}
cout<<loc_end_pos[n-1]<<endl;
for(int i=0;i<pos;i++)
{
cout<<stu[i].id<<" "<<stu[i].whole_rank<<" "<<stu[i].location_number<<" "<<stu[i].location_rank<<endl;
}
}