PAT A1025 PAT Ranking
自己做的和书上答案大体一致,但在local_ranking问题上卡壳了,菜啊<_>
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//定义结构体
struct Student{
char id[15];
int grade;
int place;
int local_rank;
}stu[30010];
//排序函数
bool cmp(Student a,Student b){
if(a.grade!=b.grade) return a.grade>b.grade;
else return strcmp(a.id,b.id)<0;
}
int main(){
int place,p,num[110],n=0,sum=0;
scanf("%d",&place);
for(int i=0;i<place;i++){
scanf("%d",&num[i]);
p=i+1;
for(int j=0;j<num[i];j++){
scanf("%s %d",&stu[n].id,&stu[n].grade);
stu[n].place=p;
n++;
}
sum+=num[i];
sort(stu+sum-num[i],stu+sum,cmp);//同一地区排序
stu[sum-num[i]].local_rank=1;
for(int j=sum-num[i]+1;j<sum;j++){//确定同一地区的排名
if(stu[j].grade==stu[j-1].grade)
stu[j].local_rank=stu[j-1].local_rank;
else stu[j].local_rank=j+1-(sum-num[i]);
}
}
sort(stu,stu+sum,cmp);//整体排序
printf("%d\n",sum);
int same=0;//same是并列个数,2个人并列same=1;
for(int i=0;i<sum;i++){
printf("%s ",stu[i].id);
if(i!=0&&stu[i].grade==stu[i-1].grade){
same++;
printf("%d ",i-same+1);
}
else{
same=0;
printf("%d ",i+1);
}
printf("%d %d\n",stu[i].place,stu[i].local_rank);
}
return 0;
}