PAT A1012 The Best Rank

问题:

  1. 这个题和以前题不同之处在于每个学生有多个要排序的数据,如果分别用4个变量表示,就要写4个cmp函数。如果用一个数组+now变量,一个cmp函数就可以了。
  2. 并没有将排名放入结构体中,由于要查询id对应的排名,就另外用了一个二维数组Rank[1000000][4]来记录,这样就可以随机访问了。
  3. 由于各门成绩的排名之间有优先级,于是记录分数和排名的数组就按优先级来顺序记录。在最后查找最高排名时,从前往后顺序查找,用k记录下标,这样当多个最高排名相同是,自然记录的就是优先级最高的那个。
    结构体内容,排名怎么记录,cmp函数
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

struct student{
    int id;//存放6位整数的id
    int grades[4];//存放4个分数
} stu[2010];

char course[4] = {'A', 'C', 'M', 'E'};//按优先级顺序,方便输出
int Rank[1000000][4] = {0};//Rank[id][0]~Rank[id][3]为四门课对应的排名
int now;//cmp函数中使用,表示当前按now号分数排序stu数组

bool cmp(student s1,student s2){//数组 + now这样就不用写4个cmp函数了
    return s1.grades[now] > s2.grades[now];
}

int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n;i++){
        //读入分数,其中grades[0]~grades[3]分别代表A,C,M,E
        scanf("%d%d%d%d", &stu[i].id, &stu[i].grades[1], &stu[i].grades[2], &stu[i].grades[3]);
        stu[i].grades[0] = stu[i].grades[1] + stu[i].grades[2] + stu[i].grades[3];
    }
    for (now = 0; now < 4;now++){
        sort(stu, stu + n, cmp);
        Rank[stu[0].id][now] = 1;
        for (int i = 1; i < n;i++){
            if(stu[i].grades[now] == stu[i-1].grades[now])
                Rank[stu[i].id][now] = Rank[stu[i - 1].id][now];
            else
                Rank[stu[i].id][now] = i + 1;
        }
    }
    int query;//查询id
    for (int i = 0; i < m;i++){
        scanf("%d", &query);
        if(Rank[query][0]==0)
            printf("N/A\n");
        else{
            int k = 0;
            for (int j = 1; j < 4;j++){
                if(Rank[query][j]<Rank[query][k])
                    k = j;
            }
            printf("%d %c\n", Rank[query][k], course[k]);
        }        
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值