【华为OD机试】真题B卷-比赛评分(C++)

华为OD机试真题汇总目录

    【华为OD机试】真题汇总A+B+C+D券(Python实现)

    【华为OD机试】真题汇总A+B+C+D卷(JAVA实现)

    【华为OD机试】真题汇总A+B+C+D卷(C++实现)

一、题目

题目描述:

一个有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,无效分数

四、解题思路

  1. 定义 parseToIntVector 函数用于将字符串分割为整数向量。
  2. 定义 parseToStrVector 函数用于将字符串分割为字符串向量。
  3. 定义 comparePlayers 函数作为比较函数,用于排序队员信息。
  4. 主函数中读取输入数据,处理输入的矩阵和队员信息。
  5. 对每位队员的得分进行排序,并计算总分。
  6. 将队员信息按照总分和最高分降序排列。
  7. 输出前三名队伍的编号。

五、参考代码

/*
 * @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;
}