PAT(Advanced Level) 1012 The Best Rank

已知 n 个考生的 3 门分数,算出平均分,分别对这四个分数进行降序排序,因此每个考生有 4 个排名。给出 m 个查询 id,输出当前 id 最好的排名以及其对应的科目名称,如果名次相同,按照 A > C > M > E 的优先级输出。若 id 不存在,输出 N/A 。

  1. 结构体存储学生的 id 、四门成绩及排名、最好的排名的对应的科目下标
  2. 存储的时候就按照 A > C > M > E 的优先级存储,可以简化后续步骤
  3. exist 数组负责检验当前 id 是否存在 ( != 0 ),exist [ id ] 的值为结构体数组 stu [ ] 中 id 对应结构体的下标 + 1 。

注:排名并列应该1、1、3、4、5,而不是1、1、2、3、4

#include<iostream>
#include<algorithm>
using namespace std;
struct student{
    int id,best;
    int sorce[4],rank[4];
}stu[2001];
int exist[1000000]={0},flag;
char c[5]="ACME";

bool cmp(student a,student b){
    return a.sorce[flag] > b.sorce[flag];
}

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d",&stu[i].id,&stu[i].sorce[1],&stu[i].sorce[2],&stu[i].sorce[3]);
        stu[i].sorce[0] = (stu[i].sorce[1] + stu[i].sorce[2] + stu[i].sorce[3]) / 3.0 + 0.5;
    }
    for(flag=0;flag<=3;flag++){
        sort(stu,stu+n,cmp);
        stu[0].rank[flag] = 1;
        for(int i=1;i<n;i++){
            stu[i].rank[flag] = i + 1;
            if(stu[i].sorce[flag] == stu[i-1].sorce[flag])
                stu[i].rank[flag] = stu[i-1].rank[flag];
        }
    }
    for(int i=0;i<n;i++){
        exist[stu[i].id] = i + 1;
        stu[i].best = 0;
        int minbest = stu[i].rank[0];
        for(int j=1;j<=3;j++){
            if(stu[i].rank[j] < minbest){
                minbest = stu[i].rank[j];
                stu[i].best = j;
            }
        }
    }
    int id;
    for(int i=0;i<m;i++){
        scanf("%d",&id);
        if(exist[id] == 0) printf("N/A\n");
        else{
            int k = stu[exist[id]-1].best;
            printf("%d %c\n",stu[exist[id]-1].rank[k],c[k]);
        }
    }
}

思路借鉴于柳神博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值