2024华为OD机试真题目录-(B卷C卷D卷)-【C++ Java Python】
题目描述
公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,
需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。
过滤的规则为:
- 找到分差最小的员工ID对(p1,p2)列表,要求p1<p2
- 员工个数取值范国:O<n<100000
- 员工ID为整数,取值范围:0<=n<=100000
- 考试成绩为整数,取值范围:0<=score<=300
输入描述
员工的ID及考试分数
输出描述
分差最小的员工ID对(p1,p2)列表,要求p1<p2。每一行代表一个集合,每个集合内的员工ID按顺序排列,多行结果也以员工对中p1值大小升序排列(如果p1相同则p2升序)。
样例1
输入:
5
1 90
2 91
3 95
4 96
5 100
输出:
1 2
3 4
解释:
输入:第一行为员工个数n,后续的n行第一个数值为员工ID,第二个数值为员工考试分数
输出:员工1和员工2的分差为1,员工3和员工4的分差也为1,因此最终结果为
1 2
3 4
样例2
输入:
5
1 90
2 91
3 92
4 85
5 86
输出:
1 2
2 3
4 5
考点
多条件排序
解题思路
1.用pair a存每个人的工号和成绩,按pair.second进行升序排序,对相邻
的人求成绩的差值,找出最小成绩差;
2.再次遍历数组,对相邻成绩差为最小差值的员工id按升序存到pair b中;
3.最后,按b.first升序进行排序,得到最后的顺序。
代码
c++
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int> a, pair<int,int> b) {
return a.second<b.second;
}
bool cmp1(vector<int> a, vector<int> b) {
if(a[0]!=b[0])
return a[0]<b[0];
else
return a[1]<b[1];
}
int main() {
int n;
cin>>n;
vector<pair<int,int>> vec;
for(int i=0;i<n;i++) {
int a,b;
cin>>a>>b;
vec.push_back