华为OD机试 - 冠亚军排名(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

2012年伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:

  1. 首先gold medal数量最多的排在前面;
  2. 其次silver medal数量最多的排在前面;
  3. 然后bronze medal数量最多的排在前面;
  4. 若以上三个条件仍无法区分名次,则以国家名称的字典顺序排定。

我们假设国家名称由通过二十六个字母,各奖牌数据不超过100,且大于0。

二、输入描述

第一行输入一个整数N(0 < N < 21),代表国家数量;

然后接下来的N行,每行包含: 一个字符串Name表示各个国家的名称和三个整数Gi, Si, Bi表示每个国家获得的gold medal, silver medal, bronze medal的数量,以空格隔开,如China 51 20 21。

具体见样例输入。

5

China 32 28 34

England 12 34 22

France 23 33 2

Japan 12 34 25

Rusia 23 43 0

三、输出描述

按照奖牌榜的依次顺序,只输出国家名称,每行占一行,具体如下:

示例输出:

China

Rusia

France

Japan

England

四、测试用例

测试用例1:

1、输入

4

Germany 10 10 10

Austria 10 10 10

Belgium 10 10 10

Denmark 10 10 10

2、输出

Austria

Belgium

Denmark

Germany

3、说明

测试用例2:

1、输入

6

India 15 20 25

Australia 15 20 20

NewZealand 15 20 25

SouthAfrica 10 30 40

Italy 15 25 20

Spain 15 20 25

2、输出

Italy

India

NewZealand

Spain

Australia

SouthAfrica

3、说明

五、解题思路

  1. 数据存储:首先,我们需要存储每个国家的名称及其金、银、铜牌数量。可以定义一个 Country 类来表示每个国家,其中包含名称和三种奖牌的数量。
  2. 排序规则:根据题目描述,排序需要按照以下优先级:
    • 金牌数量降序
    • 银牌数量降序
    • 铜牌数量降序
  3. 国家名称的字典顺序升序
    • 为了实现这一排序规则,可以让 Country 类实现 Comparable 接口,并在 compareTo 方法中按照上述规则进行比较。
  4. 数据结构:使用 ArrayList 来存储所有国家的信息。读取所有输入后,使用 Collections.sort 方法对列表进行排序。
  5. 输入输出:使用 Scanner 类读取输入,按照题目要求读取国家数量和每个国家的详细信息。排序后,按顺序输出每个国家的名称。
  6. 测试:在编写代码后,通过示例输入和自定义的五个测试用例来验证代码的正确性。

六、Python算法源码

python 复制代码
# Python 版本

# 导入所需的模块
import sys

# 定义国家类
class Country:
    def __init__(self, name, gold, silver, bronze):
        self.name = name        # 国家名称
        self.gold = gold        # 金牌数量
        self.silver = silver    # 银牌数量
        self.bronze = bronze    # 铜牌数量

# 主函数
def main():
    # 读取输入的所有行
    input_lines = sys.stdin.read().splitlines()
    if not input_lines:
        return

    # 第一行是国家数量N
    N = int(input_lines[0].strip())
    countries = []

    # 读取接下来的N行,每行包含国家名称及金银铜牌数量
    for i in range(1, N + 1):
        parts = input_lines[i].strip().split()
        name = parts[0]
        gold = int(parts[1])
        silver = int(parts[2])
        bronze = int(parts[3])
        countries.append(Country(name, gold, silver, bronze))

    # 按照金牌、银牌、铜牌降序,名称升序排序
    countries_sorted = sorted(countries, key=lambda x: (-x.gold, -x.silver, -x.bronze, x.name))

    # 输出排序后的国家名称
    for country in countries_sorted:
        print(country.name)

# 调用主函数
if __name__ == "__main__":
    main()

七、JavaScript算法源码

javascript 复制代码
// JavaScript 版本

// 定义国家类
class Country {
    constructor(name, gold, silver, bronze) {
        this.name = name;       // 国家名称
        this.gold = gold;       // 金牌数量
        this.silver = silver;   // 银牌数量
        this.bronze = bronze;   // 铜牌数量
    }
}

// 主函数
function main() {
    const fs = require('fs');
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');

    // 第一行是国家数量N
    const N = parseInt(input[0]);
    const countries = [];

    // 读取接下来的N行,每行包含国家名称及金银铜牌数量
    for (let i = 1; i <= N; i++) {
        const parts = input[i].trim().split(' ');
        const name = parts[0];
        const gold = parseInt(parts[1]);
        const silver = parseInt(parts[2]);
        const bronze = parseInt(parts[3]);
        countries.push(new Country(name, gold, silver, bronze));
    }

    // 按照金牌、银牌、铜牌降序,名称升序排序
    countries.sort((a, b) => {
        if (b.gold !== a.gold) return b.gold - a.gold;           // 金牌降序
        if (b.silver !== a.silver) return b.silver - a.silver; // 银牌降序
        if (b.bronze !== a.bronze) return b.bronze - a.bronze; // 铜牌降序
        return a.name.localeCompare(b.name);                     // 名称升序
    });

    // 输出排序后的国家名称
    countries.forEach(country => {
        console.log(country.name);
    });
}

// 调用主函数
main();

八、C算法源码

c 复制代码
/* C 版本 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 定义国家结构体
typedef struct {
    char name[101];   // 国家名称
    int gold;         // 金牌数量
    int silver;       // 银牌数量
    int bronze;       // 铜牌数量
} Country;

// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
    Country* c1 = (Country*)a;
    Country* c2 = (Country*)b;
    
    // 按金牌数量降序
    if (c2->gold != c1->gold)
        return c2->gold - c1->gold;
    // 按银牌数量降序
    if (c2->silver != c1->silver)
        return c2->silver - c1->silver;
    // 按铜牌数量降序
    if (c2->bronze != c1->bronze)
        return c2->bronze - c1->bronze;
    // 按国家名称字典顺序升序
    return strcmp(c1->name, c2->name);
}

int main() {
    int N;
    // 读取国家数量
    if (scanf("%d", &N) != 1)
        return 0;
    
    Country countries[N];
    
    // 读取每个国家的信息
    for (int i = 0; i < N; i++) {
        scanf("%s %d %d %d", countries[i].name, &countries[i].gold, &countries[i].silver, &countries[i].bronze);
    }
    
    // 对国家数组进行排序
    qsort(countries, N, sizeof(Country), compare);
    
    // 输出排序后的国家名称
    for (int i = 0; i < N; i++) {
        printf("%s\n", countries[i].name);
    }
    
    return 0;
}

九、C++算法源码

cpp 复制代码
// C++ 版本

#include <bits/stdc++.h>
using namespace std;

// 定义国家结构体
struct Country {
    string name;    // 国家名称
    int gold;       // 金牌数量
    int silver;     // 银牌数量
    int bronze;     // 铜牌数量
};

// 比较函数,用于排序
bool compareCountries(const Country &a, const Country &b) {
    if (a.gold != b.gold)
        return a.gold > b.gold;          // 金牌降序
    if (a.silver != b.silver)
        return a.silver > b.silver;      // 银牌降序
    if (a.bronze != b.bronze)
        return a.bronze > b.bronze;      // 铜牌降序
    return a.name < b.name;              // 名称升序
}

int main(){
    int N;
    // 读取国家数量
    cin >> N;
    vector<Country> countries;
    
    // 读取每个国家的信息
    for(int i = 0; i < N; ++i){
        Country c;
        cin >> c.name >> c.gold >> c.silver >> c.bronze;
        countries.push_back(c);
    }
    
    // 对国家向量进行排序
    sort(countries.begin(), countries.end(), compareCountries);
    
    // 输出排序后的国家名称
    for(auto &c : countries){
        cout << c.name << endl;
    }
    
    return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
zhihuaba3 分钟前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
u0109272714 分钟前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
Hi_kenyon6 分钟前
理解vue中的ref
前端·javascript·vue.js
Stream_Silver1 小时前
【Agent学习笔记3:使用Python开发简单MCP服务】
笔记·python
穿过锁扣的风1 小时前
零基础入门 Python 爬虫:从基础到实战,爬取虎扑 / 豆瓣 / 图片全掌握
开发语言·爬虫·python
jin1233221 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
Stream_Silver1 小时前
【Agent学习笔记2:深入理解Function Calling技术:从原理到实践】
笔记·python
2501_920931701 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
love530love1 小时前
技术复盘:llama-cpp-python CUDA 编译实战 (Windows)
人工智能·windows·python·llama·aitechlab·cpp-python·cuda版本
逄逄不是胖胖2 小时前
《动手学深度学习》-60translate实现
人工智能·python·深度学习