1025 PAT Ranking (25分)
#include<cstring> #include<cstdio> #include<algorithm> using namespace std; struct student{ char name[10]; char id[15]; int score; int location_number; int local_rank; }stu[30010]; // bool cmp(student a,student b) { if(a.score!=b.score)return a.score>b.score;//若真返回 1 else return strcmp(a.id,b.id)<0; } int main() { int n,k,num=0;//考场数 考场内人数k 总人数num scanf("%d",&n);//输入考场数 //枚举 for(int i=1;i<=n;i++)//考场数目i { scanf("%d",&k); for(int j=0;j<k;j++){ scanf("%s %d",stu[num].id,&stu[num].score); stu[num].location_number=i; num++;//当num不被赋值给其他数的时候 num++和++num都一样。 } sort(stu+num-k,stu+num,cmp) ; stu[num-k].local_rank=1;//对第一名 PS:因为数组下标为0的特殊? //对剩余考生 for(int j=num-k+1;j<num;j++) { if(stu[j].score==stu[j-1].score)//分数相当时候 { stu[j].local_rank=stu[j-1].local_rank; } else { stu[j].local_rank=j+1-(num-k); } } } printf("%d\n",num); sort(stu,stu+num,cmp); //数组不用加下标的情况 sort(,,); int r=1; for(int i=0;i<num;i++) //输出同类型 即 输出很多一样样式的数据 。肯定第一个考虑枚举呀 { if(i>0&&stu[i].score!=stu[i-1].score){ r=i+1; //保证 :r不会因为跳过去缺少的数,导致 如:1 2 2 (缺少三)4 变为 1 2 2 3 } // cout<<stu[i].id<<endl<<r<<endl<<stu[i].location_number<<endl<<stu[i].local_rank<<endl; printf("%s ",stu[i].id); printf("%d %d %d\n",r,stu[i].location_number,stu[i].local_rank); } return 0; }
唯有学习才能求生