题目链接:1012 The Best Rank
解题思路:分别对各科成绩和平均成绩进行排名并记录,之后输出学生各科和平均成绩中按照优先级最好的排名。
坑点:若有n个人排名同为i,则下一个排名应该为i+n,而非i+1.
AC代码:
/*1012 the best rank*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
struct stu
{
string id;
int c_grade,m_grade,e_grade,avg,c_rank,m_rank,e_rank,avg_rank;
};
bool cmp_c(stu a,stu b)
{
return a.c_grade > b.c_grade;
}
bool cmp_m(stu a,stu b)
{
return a.m_grade > b.m_grade;
}
bool cmp_e(stu a,stu b)
{
return a.e_grade > b.e_grade;
}
bool cmp_avg(stu a,stu b)
{
return a.avg > b.avg;
}
int main()
{
int n,m,stu_rank,same_rank;
cin >> n >> m;
stu students[n];
for(int i = 0; i != n; ++i)//读取数据
{
cin >> students[i].id >> students[i].c_grade >> students[i].m_grade >> students[i].e_grade;
students[i].avg = (students[i].c_grade + students[i].m_grade + students[i].e_grade) / 3;
}
vector<string> query;
string q_id;
for(int i = 0; i != m; ++i)//读取需要查询排名的人
{
cin >> q_id;
query.push_back(q_id);
}
/*分别按照C、math、English、average进行排名,并读入排名*/
sort(students,students + n,cmp_c);
stu_rank = 1,same_rank = 1;
for(int i = 0; i != n - 1; ++i)
{
if(students[i].c_grade > students[i+1].c_grade){
students[i].c_rank = stu_rank;
stu_rank += same_rank;
same_rank = 1;
}
else{
students[i].c_rank = stu_rank;
same_rank++;
}
}
students[n - 1].c_rank = stu_rank;
sort(students,students + n,cmp_m);
stu_rank = 1,same_rank = 1;
for(int i = 0; i != n - 1; ++i)
{
if(students[i].m_grade > students[i+1].m_grade){
students[i].m_rank = stu_rank;
stu_rank += same_rank;
same_rank = 1;
}
else{
students[i].m_rank = stu_rank;
same_rank++;
}
}
students[n - 1].m_rank = stu_rank;
sort(students,students + n,cmp_e);
stu_rank = 1,same_rank = 1;
for(int i = 0; i != n - 1; ++i)
{
if(students[i].e_grade > students[i+1].e_grade){
students[i].e_rank = stu_rank;
stu_rank += same_rank;
same_rank = 1;
}
else{
students[i].e_rank = stu_rank;
same_rank++;
}
}
students[n - 1].e_rank = stu_rank;
sort(students,students + n,cmp_avg);
stu_rank = 1,same_rank = 1;
for(int i = 0; i != n - 1; ++i)
{
if(students[i].avg > students[i+1].avg){
students[i].avg_rank = stu_rank;
stu_rank += same_rank;
same_rank = 1;
}
else{
students[i].avg_rank = stu_rank;
same_rank++;
}
}
students[n - 1].avg_rank = stu_rank;
/*进行查询并输出,优先级为 avg > c > m > e*/
int index;
for(auto q : query)
{
for(index = 0; index != n && students[index].id != q; ++index);
if(index == n)
{
cout << "N/A" << '\n';
}
else if(students[index].avg_rank <= students[index].c_rank && students[index].avg_rank <= students[index].m_rank && students[index].avg_rank <= students[index].e_rank)
{
cout << students[index].avg_rank << ' ' << 'A' << '\n';
}
else if(students[index].c_rank < students[index].avg_rank && students[index].c_rank <= students[index].m_rank && students[index].c_rank <= students[index].e_rank)
{
cout << students[index].c_rank << ' ' << 'C' << '\n';
}
else if(students[index].m_rank < students[index].avg_rank && students[index].m_rank < students[index].c_rank && students[index].m_rank <= students[index].e_rank)
{
cout << students[index].m_rank << ' ' << 'M' << '\n';
}
else
{
cout << students[index].e_rank << ' ' << 'E' << '\n';
}
}
return 0;
}