A5.分数线划定 普及- 题解
2024-03-02 20:25:49
发布于:浙江
16阅读
0回复
0点赞
这是本蒟蒻的第一篇题解
题目分析
题目的核心是计算面试分数线,并根据这个分数线筛选出进入面试的选手。具体步骤如下:
读取输入数据
首先,读取总选手数n和计划录取志愿者人数m。然后,读取每位选手的报名号和笔试成绩。
计算面试分数线
m计算面试分数线。面试分数线是排名第m * 150%(向下取整,函数floor(float a OR double b))名的选手的分数。这意味着如果计划录取m名志愿者,那么排名在m * 150%以内(包括边界)的选手都能进入面试。
筛选和排序
根据面试分数线,筛选出所有笔试成绩不低于面试分数线的选手。然后,按照题目要求对这些选手的成绩进行排序:首先按成绩降序排序,如果成绩相同,则按报名号升序排序。
输出结果
首先输出面试分数线和实际进入面试的选手人数。然后,按照成绩(降序)和报名号(升序)顺序,输出这些选手的报名号和笔试成绩。
解题关键
排序算法的选择
使用常见的排序算法(如快速排序、归并排序等)或直接利用编程语言提供的排序函数sort。
数据结构的设计
为了方便地同时处理报名号和成绩,可以定义一个简单的结构体或类,或者使用两个并行数组(一个存储报名号,另一个存储成绩)。
精确控制排序规则
需要准确实现题目要求的排序规则——首先按成绩降序,再按报名号升序。
注意边界条件
特别是面试分数线的计算和重分情况的处理,需要仔细考虑。
代码环节
前面的题目解析你看了吗?
就知道你没看,都是冲着答案来的,但也有例外
AC代码!AC,GO!
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 5000;
int ids[MAXN], scores[MAXN];
// 自定义比较函数,需要同时考虑成绩和报名号
bool compare(int i, int j) {
if (scores[i] == scores[j]) return ids[i] < ids[j]; // 成绩相同,按报名号升序
return scores[i] > scores[j]; // 成绩不同,按成绩降序
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> ids[i] >> scores[i];
}
// 使用下标数组进行排序
int index[MAXN];
for (int i = 0; i < n; ++i) index[i] = i;
sort(index, index + n, compare);
// 计算面试分数线
int rank = m * 1.5 - 1;
int interview_score_line = scores[index[rank]];
// 计算实际进入面试的选手人数
int actual_num = 0;
for (int i = 0; i < n; ++i) {
if (scores[index[i]] >= interview_score_line) {
++actual_num;
} else {
break;
}
}
// 输出结果
cout << interview_score_line << " " << actual_num << endl;
for (int i = 0; i < actual_num; ++i) {
cout << ids[index[i]] << " " << scores[index[i]] << endl;
}
return 0;
}
其他没什么了,这篇题解到此结束
全部评论 1
强
2024-05-20 来自 广东
0
有帮助,赞一个