【1025】PAT Ranking (25 分)

举报
野猪佩奇996 发表于 2022/01/22 23:57:26 2022/01/22
【摘要】 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...

  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. using namespace std;
  11. 注意该考场数组区间为[num-k,num)和其他边界
  12. 同分则后面的排名要隔后,局部和全局处理不同,后者按顺序边计算总排名,边输出所有考生的信息
  13. struct Student{
  14. char id[15]; //准考证号
  15. int score; //分数
  16. int location_number; //考场号
  17. int local_rank; //考场内排名
  18. }stu[30010];
  19. bool cmp(Student a,Student b){
  20. if(a.score != b.score ) return a.score>b.score; //先按分数从高到低排序
  21. else return strcmp(a.id,b.id)<0; //若分数相同,则按准考证号从小到大排序
  22. }
  23. int main(){
  24. int n,k,num=0; //num为总考生数!!!!
  25. scanf("%d",&n); //n为考场数
  26. for(int i=1;i<=n;i++) {
  27. scanf("%d",&k); //该考场内的人数
  28. for(int j=0;j<k;j++){
  29. scanf("%s %d",stu[num].id, &stu[num].score);
  30. stu[num].location_number=i; //该考生的考场号为i
  31. num++;
  32. }
  33. sort(stu+num-k,stu+num,cmp); //将该考场的考生排序
  34. stu[num-k].local_rank=1; //该考场第1名的local_rank记为1
  35. for(int j=num-k+1;j<num;j++){ //对该考场剩余的考生
  36. if(stu[j].score == stu[j-1].score) { //如果与前一位考生同分
  37. stu[j].local_rank=stu[j-1].local_rank; //loca_rank也相同
  38. }else{ //如果与前一位考生不同,local_rank为该考生前的人数
  39. stu[j].local_rank=j+1-(num-k) ;
  40. }
  41. }
  42. }
  43. printf("%d\n",num) ; //输出总考生数
  44. sort(stu,stu+num,cmp); //将所有考生排序
  45. int r=1; //当前考生的排名
  46. for(int i=0;i<num;i++){
  47. if(i>0 && stu[i].score != stu[i-1].score){
  48. r=i+1; //当前考生与上一个考生分数不同时,让r更新为人数+1
  49. }
  50. printf("%s ",stu[i].id);
  51. printf("%d %d %d\n",r,stu[i].location_number,stu[i].local_rank);
  52. }
  53. system("pause");
  54. return 0;
  55. }

 

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/99323772

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。