[toc]
题目介绍
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805502658068480
题目考点
排序、模拟,重点在模拟而非排序
题目难度
PAT甲级25分
题目大意
给出多个学生的C语言(C)、数学(M)、英语成绩(E),要求四舍五入计算3门课的均分(A),请在这4个成绩中输出指定同学的best rank。
输入
- N:学生的数量,不超过2000
- M:查询的数量,不超过2000
- N个学生的成绩:每行包括学生ID(6个数字组成的string)、C语言成绩、数学成绩、英语成绩
- M个要查询的学生ID
输出
- 对于要查询的每一个学生,在一行中输出其best rank以及此rank对应的科目
- rank方法为A
>
C>
M>
E,如果有1个学生有多个best rank相同,则输出优先级高的那个 - 如果查询的学生不存在,输出N/A。
题解
解题思路
需要解决的问题
如何求出best rank?
要求best rank,就需要先求出每个学生每个科目的rank,然后取最优。
ID是6位数字,严格来讲需要用string保存,那如何定义索引进而通过索引获取学生信息?
如何实现rank方法的优先级?
如何判断学生是否存在?
注意点
淦,自己的思路卡在怎么处理ID了。大神的思路真的妙,我咋这么笨……
思路:如果ID作为索引并不方便,用map或者数组将ID映射到索引是更好的方法。
关于best rank,我开始想的是进行多次排序,每次排序后更新best rank。
如果这么做,因为rank有优先级就需要按照A、C、M、E的顺序排序,这样也是可行的。
但我没想到用数组保存多个分数,这样可以通过index来循环,就不用重复写几次排序和rank更新,同时可以在存储/遍历的时候就按照ACME的顺序存储/遍历以简化程序逻辑。这里的关键点是用数组和循环的方式实现一个操作的多次重复。
排名不能是
1,1,2,3,4
,应该是1,1,3,4,5
。
代码
1 | // Problem: PAT Advanced 1012 |
参考链接
Github(github.com):@chouxianyu
Github Pages(github.io):@臭咸鱼
知乎(zhihu.com):@臭咸鱼
博客园(cnblogs.com):@臭咸鱼
B站(bilibili.com):@绝版臭咸鱼
微信公众号:@臭咸鱼
转载请注明出处,欢迎讨论和交流!