【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");
}
}
}
哈哈,重复代码很多。其实每次处理是可以整理成函数的,这样可以减少代码量,使代码更加优雅。但是为了省时间,就先这样吧。