PAT甲级 1025 PAT Ranking 模拟+排序

41 篇文章 1 订阅

在这里插入图片描述
在这里插入图片描述

Solution:

这道题的意思是PAT共有n个考场,每个考场有不同数量的考生,每个考场的考生数量为k,考场编号为1~n。每个考生有考号、成绩、所在考场编号、当前考场排名以及所有考场总排名这些信息。我们需要计算每个考生的分区排名,总体排名,最后按总体排名打印考生信息。

代码如下:

//模拟+排序
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int n,k;//n个考场,每个考场k个考生
struct student{
  string number;//编号
  int final_rank;//最终排名
  int location_number;//考场编号
  int local_rank;//当地排名
  int grade;//成绩
}stu[30005];

bool cmp(student a,student b){
  if(a.grade==b.grade){
    return a.number<b.number;
  }
  return a.grade>b.grade;
}

int main(){
  cin>>n;
  int pos=1;//标记考场编号(从1到n)
  int m=0;//表示学生数
  for(int i=0;i<n;i++){
    cin>>k;
    for(int j=0;j<k;j++){
      cin>>stu[m].number>>stu[m].grade;
      stu[m].location_number=pos;
      m++;
    }
    sort(stu+m-k,stu+m,cmp);
    int ans=1;//当前排名
    int temp=2;
    stu[m-k].local_rank=1;
    for(int h=m-k+1;h<m;h++){//计算每个考生的分区排名
        if(stu[h].grade==stu[h-1].grade){
            stu[h].local_rank=ans;
        }else{
            ans=temp;
            stu[h].local_rank=ans;
        }
        temp++;
    }
    pos++;
  }
  sort(stu,stu+m,cmp);
  stu[0].final_rank=1;
  int ans=1;
  int temp=2;
  for(int h=1;h<m;h++){//计算每个考生的全体排名
    if(stu[h].grade==stu[h-1].grade){
            stu[h].final_rank=ans;
    }else{
            ans=temp;
            stu[h].final_rank=ans;
    }
    temp++;
  }
  cout<<m<<endl;
  for(int i=0;i<m;i++){
    if(i!=m-1){
      cout<<stu[i].number<<' '<<stu[i].final_rank<<' '<<stu[i].location_number<<' '<<stu[i].local_rank<<endl;
    }else{
      cout<<stu[i].number<<' '<<stu[i].final_rank<<' '<<stu[i].location_number<<' '<<stu[i].local_rank;
    }
  }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值