碰上这种题就头疼,不过看完别人的答案知道思路以后做起来倒也顺畅
Note:
1、数据结构
这题数据结构的选择很重要,看到一个很好的思路就是像数据库一样把每个学生当作一个结构体,在其中再使用数组表示学生的成绩和排名,并附加一个最好的排名方便查询
2、排序
先用sort排好序,遍历一遍逐个填入排名,然后再遍历一遍看有没有分数并列的情况,如果有就令他的排名等于前一名的排名。两个过程可以一次遍历完成。
3、索引方法(加速方法)
单独开一个exist数组,exist中存的是stu的索引下标。这种思路简直太巧妙了。不过要注意,因为初始化和判否条件均为0,所以0本身不能作为索引,需要先+1,在使用的时候再-1即可。
Code:
#include<iostream>
#include<algorithm>
using namespace std;
struct student {
int rank[4];
int score[4];
int id;
int best;
};
student stu[2002];
int exist[1000000] = { 0 };
char label[5] = { "ACME" };
int tag;
bool cmp(student s1, student s2) {
return s1.score[tag] > s2.score[tag];
}
int main() {
int n, m;
cin >> n >> m;
/*读入学生成绩*/
for (int i = 0; i < n; i++)
{
cin >> stu[i].id &