PATA1012题解

使用结构体存储,使用4次排序,分别记录每一科的排名;

使用哈希映射,在最后一次排序时记录ID所对应的位次。


//
//  main.cpp
//  PATA1012
//
//  Created by Phoenix on 2018/1/31.
//  Copyright © 2018年 Phoenix. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2010;
int flag[1000000] = {0};
char c[4] = {'A', 'C', 'M', 'E'};

struct Student {
    int id;
    int mark[4];
    int rank[4];
}stu[maxn];

bool cmp0(Student a, Student b) {
    return a.mark[0] > b.mark[0];
}

bool cmp1(Student a, Student b) {
    return a.mark[1] > b.mark[1];
}

bool cmp2(Student a, Student b) {
    return a.mark[2] > b.mark[2];
}

bool cmp3(Student a, Student b) {
    return a.mark[3] > b.mark[3];
}

void print(int id){
    if(flag[id] == 0) printf("N/A\n");
    else{
        int k;
        int MIN = maxn;
        for(int i = 0; i <= 3; i++) {
            //printf("%d ",stu[flag[id] - 1].mark[i]);
            if(stu[flag[id] - 1].rank[i] < MIN) {
                MIN = stu[flag[id] - 1].rank[i];
                k = i;
            }
        }
        printf("%d %c\n", MIN, c[k]);
    }
}

int main(int argc, const char * argv[]) {
    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].mark[1], &stu[i].mark[2], &stu[i].mark[3]);
        stu[i].mark[0] = (stu[i].mark[1] + stu[i].mark[2] + stu[i].mark[3]);
    }
    int rank;
    sort(stu, stu + n, cmp0);
    rank = 1;
    stu[0].rank[0] = rank;
    for(int i = 1; i < n; i++) {
        if(stu[i].mark[0] == stu[i - 1].mark[0]){
            stu[i].rank[0] = rank;
        }else {
            rank = i + 1;
            stu[i].rank[0] = rank;
        }
    }
    sort(stu, stu + n, cmp1);
    rank = 1;
    stu[0].rank[1] = rank;
    for(int i = 1; i < n; i++) {
        if(stu[i].mark[1] == stu[i - 1].mark[1]){
            stu[i].rank[1] = rank;
        }else {
            rank = i + 1;
            stu[i].rank[1] = rank;
        }
    }
    sort(stu, stu + n, cmp2);
    rank = 1;
    stu[0].rank[2] = rank;
    for(int i = 1; i < n; i++) {
        if(stu[i].mark[2] == stu[i - 1].mark[2]){
            stu[i].rank[2] = rank;
        }else {
            rank = i + 1;
            stu[i].rank[2] = rank;
        }
    }
    sort(stu, stu + n, cmp3);
    rank = 1;
    stu[0].rank[3] = rank;
    flag[stu[0].id] = 1;
    for(int i = 1; i < n; i++) {
        if(stu[i].mark[3] == stu[i - 1].mark[3]){
            stu[i].rank[3] = rank;
        }else {
            rank = i + 1;
            stu[i].rank[3] = rank;
        }
        flag[stu[i].id] = i + 1;
    }
    for(int i = 0; i < m; i++) {
        int id;
        scanf("%d", &id);
        print(id);
    }
    return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值