【PAT】A1012. The Best Rank(结构体、排序)

【PAT】A1012. The Best Rank(结构体、排序)

@(PAT)

链接:https://www.patest.cn/contests/pat-a-practise/1012

思路:
1. 使用一个struct来存储每个学生的信息。
2. 因为优先权顺序为:A > C > M > E,按照E、M、C、A的顺序进行处理。
3. 每次处理首先用自带的sort排序,注意compare函数要自己写,按照对应的成绩从高到低排序。
4. 排序之后计算排名,注意当成绩为99 99 88 88 77时,排名为1 1 2 2 5,设置一个rank变量记录排名即可。

My AC code:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct student
{
    int id; int c;
    int m; int e; int a;
    int best_rank;
    char best_course;
    student(int _id, int _c, int _m, int _e, int _a, int br, char bc) {
        id= _id; c= _c; m= _m; e= _e; a= _a; best_rank= br; best_course= bc;
    }
};

bool cmp_c(student x, student y) {
    return x.c> y.c;
}

bool cmp_m(student x, student y) {
    return x.m> y.m;
}

bool cmp_e(student x, student y) {
    return x.e> y.e;
}

bool cmp_a(student x, student y) {
    return x.a> y.a;
}

int main() {
    int n, m;
    vector<student> students;
    scanf("%d%d", &n, &m);
    for (int i= 0; i< n; i++) {
        int id, c, m, e;
        scanf("%d%d%d%d", &id, &c, &m, &e);
        int a;
        a= (c+ m+ e)/ 3;
        student temp(id, c, m ,e, a, 2001, 'E');
        students.push_back(temp);
    }
    // for E
    sort(students.begin(), students.end(), cmp_e);
    int rank= 1;
    for (int i= 0; i< students.size(); i++) {       
        if (i!= 0) {
            if (students[i].e< students[i- 1].e) rank= i+ 1;
        }
        students[i].best_rank= rank;
    }
    // for M
    sort(students.begin(), students.end(), cmp_m);
    rank= 1;
    for (int i= 0; i< students.size(); i++) {       
        if (i!= 0) {
            if (students[i].m< students[i- 1].m) rank= i+ 1;
        }
        if (students[i].best_rank>= rank) {
            students[i].best_rank= rank;
            students[i].best_course= 'M';
        }
    }
    // for C
    sort(students.begin(), students.end(), cmp_c);
    rank= 1;
    for (int i= 0; i< students.size(); i++) {       
        if (i!= 0) {
            if (students[i].c< students[i- 1].c) rank= i+ 1;
        }
        if (students[i].best_rank>= rank) {
            students[i].best_rank= rank;
            students[i].best_course= 'C';
        }
    }
    // for A
    sort(students.begin(), students.end(), cmp_a);
    rank= 1;
    for (int i= 0; i< students.size(); i++) {       
        if (i!= 0) {
            if (students[i].a< students[i- 1].a) rank= i+ 1;
        }
        if (students[i].best_rank>= rank) {
            students[i].best_rank= rank;
            students[i].best_course= 'A';
        }
    }
    // Check
    for (int i= 0; i< m; i++) {
        int id_check;
        scanf("%d", &id_check);
        bool if_found= false;
        for (int j= 0; j< students.size(); j++) {
            if (students[j].id== id_check) {
                printf("%d %c\n", students[j].best_rank, students[j].best_course);
                if_found= true;
                break;
            }
        }
        if (!if_found) {
            printf("N/A\n");
        }
    }
}

哈哈,重复代码很多。其实每次处理是可以整理成函数的,这样可以减少代码量,使代码更加优雅。但是为了省时间,就先这样吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值