#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct student{ char regnum[100]; int score; int listnum; int rank; int localrank; }stu[30010]; bool cmp(student a,student b) { if(a.score!=b.score) return a.score>b.score; return strcmp(a.regnum,b.regnum)<0; } int main() { int n,k; scanf("%d",&n); int count=0; int n2=n; while(n--) { scanf("%d",&k); int temp=count; for(int i=1;i<=k;i++) { scanf("%s %d",stu[count].regnum,&stu[count].score); stu[count++].listnum=n2-n; } sort(stu+temp,count+stu,cmp); stu[temp].localrank=1; for(int i=temp+1;i<count;i++) { if(stu[i].score==stu[i-1].score) stu[i].localrank=stu[i-1].localrank; else stu[i].localrank=i-temp+1; } } sort(stu,stu+count,cmp); printf("%d\n",count); stu[0].rank=1; for(int i=1;i<count;i++) { if(stu[i].score==stu[i-1].score) stu[i].rank=stu[i-1].rank; else stu[i].rank=i+1; } for(int i=0;i<count;i++) printf("%s %d %d %d\n",stu[i].regnum,stu[i].rank,stu[i].listnum,stu[i].localrank); return 0; }View Code
PAT A1025 sort模板题了
sort(stu,stu+count,cmp)
stu是数组起始位置,stu+count是最后一位加一个
左闭右开
cmp在里面是struct的时候是自定义的。cmp为true的条件就是排序规则
比如 return a.score>b.score sort在cmp为true不动,说明在a的分数高的时候是保持原状态的,那么说明这是一个降序数组,最高分在前面
另外注意分数相同的情况下按照大小号排序。
localrank是在输入的过程中拍出来的,不能都输入进去以后再排。直接sort(stu+temp,stu+count,cmp)