C++ Pat甲级1012 The Best Rank (25 分)(利用结构体里加数组来排名)

1012 The Best Rank (25 分)

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of CME and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (≤2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of CM and E. Then there are M lines, each containing a student ID.

Output Specification:

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output N/A.

Sample Input:

5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999

Sample Output:

1 C
1 M
1 E
1 A
3 A
N/A

输入:录入成绩的总学生数 N,将会查询成绩的学生数M

           录入N行 Id c m e(学号,C语言,数学,英语)

          录入M行 查询成绩的学生的学号

扫描二维码关注公众号,回复: 5419418 查看本文章

输出  :输出该学生考的最高的名次   该科目名称

              若该学生成绩未录入系统,则输出N/A

           (若他有两门或多门有相同的名次,则按A > C > M > E的优先级输出)

             转自:柳婼

分析:
1、用结构体存储学生的id、四门成绩、四门排名、最好的排名的对应的科目下标~
2、排名并列应该1、1、3、4、5,而不是1、1、2、3、4,否则会有一个测试点不过
3、平均分是四舍五入的,所以需要按照+0.5后取整,保证是四舍五入的(听说不四舍五入也能通过…)
4、存储的时候就按照ACME的顺序存储可以简化程序逻辑~
5、用exist数组保存当前id是否存在,这个id对应的stu结构体的下标是多少。用i+1可以保证为0的都是不存在的可以直接输出N/A,其余不为0的保存的值是对应的结构体index + 1的值~ 



#include <cstdio>
#include <algorithm>
using namespace std;
struct node {
	int id, best;
	int score[4], rank[4];
} stu[2005];
int exist[1000000], flag = -1;
bool cmp1(node a, node b) {
	return a.score[flag] > b.score[flag];
}
int main() {
	int n, m, id;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < n; i++) {
		scanf("%d %d %d %d", &stu[i].id, &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
		stu[i].score[0] = (stu[i].score[1] + stu[i].score[2] + stu[i].score[3]) / 3.0 + 0.5;
	}
	//计算排名 ,四门成绩,四门排名
	for(flag = 0; flag <= 3; flag++) {
		sort(stu, stu + n, cmp1);
		// 存排序后每门的成绩排名
		for(int i = 0; i < n; i++) {
			stu[i].rank[flag] = i + 1;
			if(stu[i].score[flag] == stu[i-1].score[flag])  //成绩相等,排名相同
				stu[i].rank[flag] = stu[i-1].rank[flag];
		}
	}

	//一个学生的四个成绩中排名最高的那门
	for(int i = 0; i < n; i++) {
		exist[stu[i].id] = i + 1;
		stu[i].best = 0;
		int minn = stu[i].rank[0];
		for(int j = 1; j <= 3; j++) {
			if(stu[i].rank[j] < minn) {
				minn = stu[i].rank[j];
				stu[i].best = j;
			}
		}
	}
	//开始查询
	char c[5] = {'A', 'C', 'M', 'E'};
	for(int i = 0; i < m; i++) {
		scanf("%d", &id);
		int temp = exist[id];
		if(temp) {
			int best = stu[temp-1].best;
			printf("%d %c\n", stu[temp-1].rank[best], c[best]);
		} else {
			printf("N/A\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37503890/article/details/87924123