A1012 The Best Rank [排序]

在这里插入图片描述

题目大意:现已知n个考生的3门分数,平均分可以按照这三门算出来。然后分别对这四个分数从高到低排序,这样对每个考生来说有4个排名。k个查询,对于每一个学生id,输出当前id学生的最好的排名和它对应的分数,如果名次相同,按照A>C>M>E的顺序输出。如果当前id不存在,输出N/A
思路:

  1. 先定义个结构体,里面包含了一个分数的数组和对应排名的数组。
  2. 输入后进行排序,排序后存到对应排名的数组中。
  3. 查询的时候还要对查询的人调选排名最高的名词和分数输出,用比较就行了。
  4. 注意排名相等的时候优先输出顺序。
    —————————————————————————
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
struct student
{
	int id;
	int grade[4];
}stu[2010];
int Rank[100000000][4] = { 0 };
char course[4] = {'A','C','M','E'};
int now = -1;
bool cmp(student a,student b)
{
	return a.grade[now] > b.grade[now];
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)		
	{
		cin >> stu[i].id >> stu[i].grade[1] >> stu[i].grade[2] >> stu[i].grade[3];
		stu[i].grade[0] = stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3];
	}

	for (now = 0; now < 4; now++) //四门成绩
	{
		sort(stu, stu+ n, cmp);
		Rank[stu[0].id][now] = 1; 
		for (int j = 1; j < n; j++)  //所有同学间比较
		{
			if (stu[j].grade[now] == stu[j-1].grade[now])
				Rank[stu[j].id][now] = Rank[stu[j - 1].id][now];
			else
				Rank[stu[j].id][now] = j + 1;
		}
	}
	int query; //查询考生的ID
	for (int i = 0; i < m; i++)
	{
		cin >> query;
		if (Rank[query][0] == 0)
			cout << "N/A" << endl;
		else
		{
			int k = 0;
			for (int j = 0; j < 4; j++)
			{
				if (Rank[query][j] < Rank[query][k])
				{
					k = j;
				}
			}
			cout << Rank[query][k] << " " << course[k] << endl;
		}
	}	
}


原文地址:https://www.cnblogs.com/Hsiung123/p/13812083.html