【华为OD机试】真题B卷-比赛评分(C++)
华为OD机试真题汇总目录
【华为OD机试】真题汇总A+B+C+D券(Python实现)
一、题目
题目描述:
一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
打分规则为每个评委对选手打分,最高分10分,最低分1分。
请计算得分最多的3位选手的编号。
如果得分相同,则得分高分值最多的选手排名靠前(10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。
二、输入输出
输入描述:
第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。
第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。
输出描述:选手前3名的编号。
注:若输入为异常,输出-1,如M、N、打分不在范围内。
三、示例
示例1:
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9
输出:
2,1,5
说明:
第一行代表有4个评委,5个选手参加比赛
矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序,
2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一)
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
2,5
7,3,5,4,2
8,5,4,4,3
输出:
-1
说明:
只有2个评委,要求最少为3个评委
示例3
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,2
8,5
5,6
10,4
8,9
输出:
-1
说明:
只有2名选手参加,要求最少为3名
示例4
输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,5
11,6,9,7,8
9,10,6,7,8
8,10,6,9,7
9,10,8,6,7
输出:
-1
说明:
第一个评委给第一个选手打分11,无效分数
四、解题思路
- 定义
parseToIntVector
函数用于将字符串分割为整数向量。- 定义
parseToStrVector
函数用于将字符串分割为字符串向量。- 定义
comparePlayers
函数作为比较函数,用于排序队员信息。- 主函数中读取输入数据,处理输入的矩阵和队员信息。
- 对每位队员的得分进行排序,并计算总分。
- 将队员信息按照总分和最高分降序排列。
- 输出前三名队伍的编号。
五、参考代码
/*
* @Author: mgc
* @Date: 2024-02-02 17:47:00
* @LastEditors: Do not edit
* @LastEditTime: 2024-02-02 17:48:55
*/
// #include<set>
// #include<map>
// #include<list>
// #include<regex>
// #include<cmath>
// #include<queue>
// #include<stack>
// #include<bitset>
// #include<utility>
// #include<stdlib.h>
// #include<string.h>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 分割字符串为整数向量
vector<int> parseToIntVector(string params_str) {
vector<int> result;
size_t pos = 0;
while ((pos = params_str.find(",")) != string::npos) {
result.push_back(stoi(params_str.substr(0, pos)));
params_str.erase(0, pos + 1);
}
result.push_back(stoi(params_str));
return result;
}
// 分割字符串为字符串向量
vector<string> parseToStrVector(string params_str) {
vector<string> result;
size_t pos = 0;
while ((pos = params_str.find(" ")) != string::npos) {
result.push_back(params_str.substr(0, pos));
params_str.erase(0, pos + 1);
}
result.push_back(params_str);
return result;
}
// 比较函数,用于排序
bool comparePlayers(vector<string> x, vector<string> y) {
if (stoi(x[2]) != stoi(y[2])) {
return stoi(y[2]) < stoi(x[2]);
} else {
return stoi(y[1]) < stoi(x[1]);
}
}
int main() {
string input_str;
getline(cin, input_str);
vector<int> dimensions = parseToIntVector(input_str);
int rows = dimensions[0];
int cols = dimensions[1];
if (rows < 3 || rows > 10 || cols < 3 || cols > 100) {
cout << -1;
return 0;
}
vector<vector<int>> matrix;
for (int i = 0; i < rows; i++) {
string row_str;
getline(cin, row_str);
vector<int> row_values = parseToIntVector(row_str);
for (int j = 0; j < cols; j++) {
if (row_values[j] > 10 || row_values[j] < 1) {
cout << -1;
return 0;
}
}
matrix.push_back(row_values);
}
vector<vector<string>> players;
for (int j = 0; j < cols; j++) {
vector<int> player_scores(rows, 0);
int sum = 0;
for (int i = 0; i < rows; i++) {
player_scores[i] = matrix[i][j];
sum += player_scores[i];
}
sort(player_scores.begin(), player_scores.end());
string score_string = "";
for (int i = 0; i < rows; i++) {
score_string += to_string(player_scores[i]);
}
vector<string> player_info;
player_info.push_back(to_string((j + 1)));
player_info.push_back(score_string);
player_info.push_back(to_string(sum));
players.push_back(player_info);
}
sort(players.begin(), players.end(), comparePlayers);
for (int i = 0; i < 3; i++) {
cout << players[i][0];
if (i != 2) {
cout << ",";
}
}
return 0;
}