1012 The Best Rank
题目大意
有点复杂,按照给出的学生每科的成绩,打印出列表里面学生最好的学科排名,如果排名相等,按优先级高的输出
算法思想
- 首先就是,有可能有相同排名的学生,这时候就要并列排名了,测试点2好像就是这种
- 列表里面的学生可能会打乱顺序
- 列表里面的学生可能不存在成绩
- 其实这道题目重要的一点就是相同排名,这种有点难处理,其他的相对好写一些
代码
#include<iostream>
#include<vector>
using namespace std;
void grade_sort(vector<vector<int>> grade, vector<int> &s,int k)//分数排序
{
int max = -1;//每科的目前最大值
int now;//记录当前最大的是第几个学生
int count = 0;//记录排到第几名了
int last;//记录上一排名的名次,用来解决并列排名
int gn=-1;//记录上一排名的分数
for (int i = 0; i < grade.size(); i++)
{
count++;
max = -1;
for (int j = 0; j < grade.size(); j++)
{
if (max < grade[j][k])//选取一个最大值
{
max = grade[j][k];
now = j;
}
}
if (gn != max)//和上一位排名的成绩不同,放心排
{
s[now] = count;
last = count;//更新上一位排名
}
else//和上一位的成绩相同,需要并列
{
s[now] = last;
}
grade[now][k] = -1;//去掉已经排好的
gn = max;//更新上一位排名成绩
}
}
int main()
{
int n, m;
int i, j, k;
cin >> n >> m;
vector<vector<int>>grade(n);
vector<int>list;
vector<vector<int>>idlist(4);
for (i = 0; i < 4; i++)
{
idlist[i].resize(n);
}
for (i = 0; i < n; i++)
{
int id, a, b, c;
cin >> id >> a >> b >> c;
grade[i].push_back(id);
grade[i].push_back(a);
grade[i].push_back(b);
grade[i].push_back(c);
grade[i].push_back((a + b + c) / 3);
}
for (i = 0; i < m; i++)
{
int id;
cin >> id;
list.push_back(id);
}
//对每一科的成绩都排一下名次,不过是按照给出名字的顺序来拍的
grade_sort(grade, idlist[0], 4);//A
grade_sort(grade, idlist[1], 1);//C
grade_sort(grade, idlist[2], 2);//M
grade_sort(grade, idlist[3], 3);//E
for (i = 0; i < m; i++)
{
bool flag = false;
int p=n+3, q=5;
for (k = 0; k < n; k++)
{
if (grade[k][0] == list[i])//找到列表该学生对应grade里面位次
{
for (j = 0; j < 4; j++)//找到该学生哪一科的最高排名
{
if (p > idlist[j][k])
{
p = idlist[j][k];
q = j;
}
}
flag = true;//找到了成绩
}
}
if (!flag)//未找到成绩
cout << "N/A" << endl;
else
{
cout << p << " ";
if (q == 0)
cout << "A";
else if (q == 1)
cout << "C";
else if (q == 2)
cout << "M";
else if (q == 3)
cout << "E";
cout << endl;
}
}
return 0;
}