华为OD机试 - 排队游戏 刺头学生(Python/JS/C/C++ 2024 E卷 200分)

news2024/10/12 15:37:42

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

新来的老师给班里的同学排一个队。

每个学生有一个影响值。

一些学生是刺头,不会听老师的话,自己选位置,剩余从听老师话的同学在剩下的位置按能力值从小到大排。

对于非刺头同学,如果发现他们前面有能力值比自己高的同学,他不满程度就增加,增加的数量等于前面能力值比他大的同学的个数。

刺头不会产生不满。

如果某个班级的总体不满程度超过k,那么老师就无法继续教这个班级了。

二、输入描述

输入有三行:

第一行为n,m,k,空格隔开,分别表示班级总人数n,刺头人数m,最大不满程度k。

第二行为刺头所在位置的下标,即排队数组的下标,比如1代表队伍中第2个同学是刺头,位置的数组也是排好序的。

第三行为n个数,空格隔开,表示老师排好的队列中每个人的能力值,其中刺头同学一定按照能力值从小到大排序的。

三、输出描述

0 表示老师可以继续教这个班级。

1 表示老师无法继续教这个班级。

备注

n 范围是 [1,100000]
m 范围是 [1,n]
k 范围是 [1,1000000000]
每位同学的能力值范围是 [1000,100000]

四、测试用例

测试用例1:

1、输入

4 2 3
0 1
1810 1809 1801 1802

2、输出

1

3、说明

刺头在0,1位置,2号同学不满程度2(前面两个刺头能力值都比他大),3号同学不满程度2,总不满程度4,大于3。输出不能教这班(1)。

测试用例2:

1、输入

4 2 4
0 1
1810 1809 1801 1802

2、输出

0

3、说明

同前,4不大于4,输出能教这个班(0)。

五、解题思路

1、数据结构和算法

(1)Fenwick 树(Binary Indexed Tree):

用途:高效地进行前缀和查询和更新操作。

原因:需要在 O(n log n) 时间内处理大量数据(n ≤ 100,000),Fenwick 树能在对数时间内完成插入和查询。

(2)坐标压缩:

用途:将能力值范围从 [1000, 100,000] 压缩到 [1, uniqueCount],以适应 Fenwick 树的索引。

原因:能力值可能很大且不连续,直接使用能力值作为索引会浪费空间。通过排序和去重,能够有效地映射能力值到连续的排名。

(3)遍历学生队列:

用途:按队列顺序处理每个学生,计算不满程度。

原因:需要根据学生在队列中的位置和能力值,动态地计算不满程度。

这种组合使得算法能够在保证效率的同时,准确地计算出总不满程度,满足题目的要求。

六、Python算法源码

# 导入必要的库
import sys
import bisect

# 定义 Fenwick 树(又称二叉索引树)类
class FenwickTree:
    def __init__(self, size):
        self.size = size
        self.tree = [0] * (size + 1)  # 初始化树,索引从1开始

    # 在索引位置添加值
    def update(self, index, value):
        while index <= self.size:
            self.tree[index] += value
            index += index & -index  # 移动到下一个需要更新的位置

    # 查询前缀和,包含当前索引
    def query(self, index):
        result = 0
        while index > 0:
            result += self.tree[index]
            index -= index & -index  # 移动到父节点
        return result

def main():
    # 读取所有输入并分割成列表
    input = sys.stdin.read().split()
    ptr = 0  # 指针初始化

    # 读取 n(总人数),m(刺头人数),k(最大不满程度)
    n = int(input[ptr])
    m = int(input[ptr + 1])
    k = int(input[ptr + 2])
    ptr += 3

    # 初始化一个布尔列表标记刺头
    rebellious = [False] * n
    for _ in range(m):
        idx = int(input[ptr])
        rebellious[idx] = True
        ptr += 1

    # 读取所有学生的能力值
    abilities = []
    for _ in range(n):
        abilities.append(int(input[ptr]))
        ptr += 1

    # 坐标压缩:将能力值排序并去重
    sorted_abilities = sorted(list(set(abilities)))
    # 为每个能力值分配一个唯一的排名
    ability_to_rank = {ability: idx + 1 for idx, ability in enumerate(sorted_abilities)}

    # 初始化 Fenwick 树,大小为唯一能力值的数量
    fenwick = FenwickTree(len(sorted_abilities))

    total_dissatisfaction = 0  # 总不满程度初始化
    inserted_count = 0  # 已插入的学生数量初始化

    for i in range(n):
        ability = abilities[i]
        rank = ability_to_rank[ability]
        if not rebellious[i]:
            # 计算已插入的学生中能力值大于当前学生的数量
            higher_count = inserted_count - fenwick.query(rank)
            total_dissatisfaction += higher_count
            # 如果总不满程度超过k,提前终止
            if total_dissatisfaction > k:
                break
        # 将当前学生的能力值插入 Fenwick 树
        fenwick.update(rank, 1)
        inserted_count += 1

    # 根据总不满程度输出结果
    if total_dissatisfaction > k:
        print(1)
    else:
        print(0)

if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 定义 Fenwick 树(又称二叉索引树)类
class FenwickTree {
    constructor(size) {
        this.size = size;
        this.tree = new Array(size + 1).fill(0); // 初始化树,索引从1开始
    }

    // 在索引位置添加值
    update(index, value) {
        while (index <= this.size) {
            this.tree[index] += value;
            index += index & -index; // 移动到下一个需要更新的位置
        }
    }

    // 查询前缀和,包含当前索引
    query(index) {
        let result = 0;
        while (index > 0) {
            result += this.tree[index];
            index -= index & -index; // 移动到父节点
        }
        return result;
    }
}

// 主函数
function main() {
    const fs = require('fs');
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split(/\s+/);
    let ptr = 0; // 指针初始化

    // 读取 n(总人数),m(刺头人数),k(最大不满程度)
    const n = parseInt(input[ptr++]);
    const m = parseInt(input[ptr++]);
    const k = parseInt(input[ptr++]);

    // 初始化一个布尔数组标记刺头
    const rebellious = Array(n).fill(false);
    for (let i = 0; i < m; i++) {
        const idx = parseInt(input[ptr++]);
        rebellious[idx] = true;
    }

    // 读取所有学生的能力值
    const abilities = [];
    for (let i = 0; i < n; i++) {
        abilities.push(parseInt(input[ptr++]));
    }

    // 坐标压缩:将能力值排序并去重
    const sortedAbilities = Array.from(new Set(abilities)).sort((a, b) => a - b);
    // 为每个能力值分配一个唯一的排名
    const abilityToRank = new Map();
    sortedAbilities.forEach((ability, index) => {
        abilityToRank.set(ability, index + 1); // 排名从1开始
    });

    // 初始化 Fenwick 树,大小为唯一能力值的数量
    const fenwick = new FenwickTree(sortedAbilities.length);

    let totalDissatisfaction = 0; // 总不满程度初始化
    let insertedCount = 0; // 已插入的学生数量初始化

    for (let i = 0; i < n; i++) {
        const ability = abilities[i];
        const rank = abilityToRank.get(ability);
        if (!rebellious[i]) {
            // 计算已插入的学生中能力值大于当前学生的数量
            const higherCount = insertedCount - fenwick.query(rank);
            totalDissatisfaction += higherCount;
            // 如果总不满程度超过k,提前终止
            if (totalDissatisfaction > k) {
                break;
            }
        }
        // 将当前学生的能力值插入 Fenwick 树
        fenwick.update(rank, 1);
        insertedCount += 1;
    }

    // 根据总不满程度输出结果
    if (totalDissatisfaction > k) {
        console.log(1);
    } else {
        console.log(0);
    }
}

// 调用主函数
main();

八、C算法源码

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

// 定义 Fenwick 树(又称二叉索引树)结构体
typedef struct {
    int size;
    long long* tree;
} FenwickTree;

// 初始化 Fenwick 树
FenwickTree* createFenwickTree(int size) {
    FenwickTree* ft = (FenwickTree*)malloc(sizeof(FenwickTree));
    ft->size = size;
    ft->tree = (long long*)calloc(size + 1, sizeof(long long)); // 初始化树,索引从1开始
    return ft;
}

// 在索引位置添加值
void updateFenwickTree(FenwickTree* ft, int index, long long value) {
    while (index <= ft->size) {
        ft->tree[index] += value;
        index += index & (-index); // 移动到下一个需要更新的位置
    }
}

// 查询前缀和,包含当前索引
long long queryFenwickTree(FenwickTree* ft, int index) {
    long long result = 0;
    while (index > 0) {
        result += ft->tree[index];
        index -= index & (-index); // 移动到父节点
    }
    return result;
}

// 比较函数,用于qsort
int cmp(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}

int main() {
    int n, m;
    long long k;
    
    // 读取 n(总人数),m(刺头人数),k(最大不满程度)
    scanf("%d %d %lld", &n, &m, &k);
    
    // 初始化一个布尔数组标记刺头
    int* rebellious = (int*)calloc(n, sizeof(int));
    for(int i = 0; i < m; i++) {
        int idx;
        scanf("%d", &idx);
        rebellious[idx] = 1;
    }
    
    // 读取所有学生的能力值
    int* abilities = (int*)malloc(n * sizeof(int));
    for(int i = 0; i < n; i++) {
        scanf("%d", &abilities[i]);
    }
    
    // 坐标压缩:将能力值排序并去重
    int* sorted = (int*)malloc(n * sizeof(int));
    memcpy(sorted, abilities, n * sizeof(int));
    qsort(sorted, n, sizeof(int), cmp);
    
    // 去重并记录唯一能力值的数量
    int uniqueCount = 1;
    for(int i = 1; i < n; i++) {
        if(sorted[i] != sorted[i - 1]) {
            sorted[uniqueCount++] = sorted[i];
        }
    }
    
    // 为每个能力值分配一个唯一的排名
    // 使用二分查找进行映射
    // 因为sorted数组已经排序且去重
    // 所以可以使用二分查找来找到每个能力值的排名
    // 初始化 Fenwick 树
    FenwickTree* fenwick = createFenwickTree(uniqueCount);
    
    long long totalDissatisfaction = 0; // 总不满程度初始化
    long long insertedCount = 0; // 已插入的学生数量初始化
    
    for(int i = 0; i < n; i++) {
        // 使用二分查找找到当前能力值的排名
        int ability = abilities[i];
        int left = 0, right = uniqueCount - 1, mid, rank = 1;
        while(left <= right) {
            mid = left + (right - left) / 2;
            if(sorted[mid] == ability) {
                rank = mid + 1; // 排名从1开始
                break;
            }
            else if(sorted[mid] < ability) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        
        if(!rebellious[i]) {
            // 计算已插入的学生中能力值大于当前学生的数量
            long long higherCount = insertedCount - queryFenwickTree(fenwick, rank);
            totalDissatisfaction += higherCount;
            // 如果总不满程度超过k,提前终止
            if(totalDissatisfaction > k) {
                break;
            }
        }
        // 将当前学生的能力值插入 Fenwick 树
        updateFenwickTree(fenwick, rank, 1);
        insertedCount += 1;
    }
    
    // 根据总不满程度输出结果
    if(totalDissatisfaction > k) {
        printf("1\n");
    }
    else {
        printf("0\n");
    }
    
    // 释放内存
    free(rebellious);
    free(abilities);
    free(sorted);
    free(fenwick->tree);
    free(fenwick);
    
    return 0;
}

九、C++算法源码

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

// 定义 Fenwick 树(又称二叉索引树)类
class FenwickTree {
public:
    int size;
    vector<long long> tree;

    // 构造函数,初始化树,索引从1开始
    FenwickTree(int sz) {
        size = sz;
        tree.assign(size + 1, 0);
    }

    // 在索引位置添加值
    void update(int index, long long value) {
        while(index <= size){
            tree[index] += value;
            index += index & (-index); // 移动到下一个需要更新的位置
        }
    }

    // 查询前缀和,包含当前索引
    long long query(int index){
        long long result = 0;
        while(index > 0){
            result += tree[index];
            index -= index & (-index); // 移动到父节点
        }
        return result;
    }
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    long long k;
    cin >> n >> m >> k;

    // 初始化一个布尔数组标记刺头
    vector<bool> rebellious(n, false);
    for(int i = 0; i < m; i++){
        int idx;
        cin >> idx;
        rebellious[idx] = true;
    }

    // 读取所有学生的能力值
    vector<int> abilities(n);
    for(int i = 0; i < n; i++) cin >> abilities[i];

    // 坐标压缩:将能力值排序并去重
    vector<int> sorted = abilities;
    sort(sorted.begin(), sorted.end());
    sorted.erase(unique(sorted.begin(), sorted.end()), sorted.end());

    // 为每个能力值分配一个唯一的排名
    // 使用 lower_bound 进行映射
    // 初始化 Fenwick 树
    FenwickTree fenwick(sorted.size());

    long long totalDissatisfaction = 0; // 总不满程度初始化
    long long insertedCount = 0; // 已插入的学生数量初始化

    for(int i = 0; i < n; i++){
        int ability = abilities[i];
        // 使用 lower_bound 找到能力值的排名
        int rank = lower_bound(sorted.begin(), sorted.end(), ability) - sorted.begin() + 1; // 排名从1开始

        if(!rebellious[i]){
            // 计算已插入的学生中能力值大于当前学生的数量
            long long higherCount = insertedCount - fenwick.query(rank);
            totalDissatisfaction += higherCount;
            // 如果总不满程度超过k,提前终止
            if(totalDissatisfaction > k){
                break;
            }
        }
        // 将当前学生的能力值插入 Fenwick 树
        fenwick.update(rank, 1);
        insertedCount += 1;
    }

    // 根据总不满程度输出结果
    if(totalDissatisfaction > k){
        cout << "1\n";
    }
    else{
        cout << "0\n";
    }

    return 0;
}


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

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2208227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划lc

先找到规律&#xff0c;然后找边界情况&#xff1b;部分特殊情况分类讨论 *递归 70.爬楼梯 简单 提示 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a…

瑞芯微RK3566/RK3568 Android11使用OTA升级固件方法,深圳触觉智能鸿蒙开发板演示,备战第九届华为ICT大赛

本文介绍瑞芯微RK3566/RK3568在Android11系统OTA升级固件方法&#xff0c;使用触觉智能的Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566&#xff0c;Laval官方社区主荐&#xff01; 1、OTA包生成 在源码根目录上执行以下命令编译OTA包 # make installclean # …

效率提高——自动登录校园网(河海大学)与模拟点击与输入获取最新消息

文章目录 零、前言一、自动登录校园网1.1 快速锁定小工具1.2 版本问题1.3 出现进程未结束的情况1.4 关于chromedriver.exe1.5 打包ico图片格式 二、获取信息门户最新消息参考文章 零、前言 最近被校园网弄的也是比较烦心&#xff0c;而且准备远程弄弄这些玩具&#xff0c;为以…

150万条多语种音频数据!浙大清华发布语音伪造检测框架SafeEar,兼顾隐私保护,附代码和数据集

150万条多语种音频数据&#xff01;浙大清华发布语音伪造检测框架SafeEar&#xff0c;兼顾隐私保护&#xff0c;附代码和数据集. SafeEar是一种内容隐私保护的语音伪造检测方法&#xff0c;其核心是设计基于神经音频编解码器的解耦模型&#xff0c;分离语音声学与语义信息&…

服务器数据恢复—硬盘坏扇区导致Linux系统服务器数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统网站服务器&#xff0c;该服务器上部署了几十个网站&#xff0c;使用一块SATA硬盘。 服务器故障&原因&#xff1a; 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败&#xff0c;于是将服务器上的硬盘拆下检测…

PostgreSQL数据库安全管理,细节都在这里了

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

要求信创检测的项目验收中,验收依据有哪些?

一、验收依据和分类 验收依据&#xff1a; 通常包括立项批复文件以及经批复的项目建议书、可行性研究报告、业务需求说明书&#xff1b;正式设计文件&#xff1b;项目招标文件和采购文件&#xff1b;签订的项目合同或协议&#xff1b;经批准的项目变更文件&#xff1b;有关法…

出海快报 | “三消+短剧”手游横空出世,黄油相机“出圈”日本市场,从Q1看日本手游市场趋势和机会

编者按&#xff1a;TopOn出海快报栏目为互联网出海从业者梳理出海热点&#xff0c;供大家了解行业最新发展态势。 1.“三消短剧”横空出世&#xff0c;融合创新手游表现亮眼 随着竞争的加剧&#xff0c;新产品想要突出重围&#xff0c;只能在游戏中加入额外的元素。第一次打开…

vue使用js-xlsx导入本地excle表格数据,回显在页面上

效果图 解释放在代码的注释中 页面代码&#xff0c;导入本地文件我用的是element的上传工具 // 我是根据js文件直接引入的 <script src"/js/xlsx.full.min.js"></script>// 导入excelreadWorkbookFromLocalFile(fileData) {// 文件信息const file f…

智能生成ppt软件哪个好?如何高效生成ppt?

想要快速制作出专业且吸引人的PPT演示文稿吗&#xff1f;ai智能生成ppt工具可以帮你实现这一目标。 无需复杂的设计技巧&#xff0c;也不必花费大量时间&#xff0c;只需几个简单的步骤&#xff0c;就能创造出令人印象深刻的演示文稿。下面是一份免费版教程&#xff0c;让你轻…

中航资本:股票低佣开户注意事项,怎么低佣金开户?

股票生意中会涉及到一些手续费&#xff0c;佣金费、印花税、过户费等&#xff0c;印花税、过户费的费率是承认的&#xff0c;而不同证券公司、生意途径的佣金费率都有或许不同。 低佣金开户办法&#xff1a; 1、线上券商途径开户&#xff1a;许多大型证券公司&#xff0c;例如…

在HF上部署你的专属MindSearch,随时随地开启智能搜索!

作者&#xff1a;MindSearch 兴趣小组成员张富才 本文将详细带领大家学习如何在 Hugging Face Space 部署****并美化专属自己的 MindSearch 应用&#xff0c;免去排队等待的烦恼&#xff0c;随时随地开启智能搜索&#xff01; 在深入开始之前&#xff0c;我们需要了解&#x…

深入理解 C/C++ 指针

深入理解 C 指针&#xff1a;指针、解引用与指针变量的详细解析 前言 在 C 编程语言中&#xff0c;指针 是一个非常强大且重要的概念。对于初学者来说&#xff0c;指针往往会让人感到困惑不解。本文将通过形象的比喻&#xff0c;帮助大家深入理解指针、解引用与指针变量的概念…

安装openai-whisper 失败

昨晚安装python 语音识别模型经常失败&#xff1a; pip install openai-whisper 具体原因是因为国外的源使网络不稳定造成断网 查阅资料我自己的解决办法是在自己C:\Users\用户名目录下建一个pip文件夹&#xff0c;在pip文件夹下建一个pip.ini文件 在pip.ini文件中加入自己要…

MYSQL 多表拼接link

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

mysql复制表结构和数据

1.实例 #复制一张和test 一摸一样的表结构 CREATE TABLE test_one like test#往复制的表结构中复制数据 INSERT INTO test_one SELECT * FROM test#两者一起使用相当于 cv大法2.总结 完全实现了表结构和数据的复制&#xff0c;但是两条sql 得分两步执行 2.1 复制表结构 #复制…

AI开源项目

开源AI知识库 FastGPT FastGPT是一个基于LLM&#xff08;大型语言模型&#xff09;的知识库问答系统项目&#xff0c;以下是对FastGPT项目的详细解释&#xff1a; 一、项目背景与团队 FastGPT由FastAI团队开发&#xff0c;该团队包含多位在机器学习和自然语言处理领域具有丰富…

大数据应用方案1-Postgresql集群

1 说明&#xff1a; 在做任何系统之前&#xff0c;选择哪种数据底座做支持很重要&#xff0c;是一栋大厦地基牢不牢固的根本问题&#xff0c;这里用Postgresql基于docker实现了分布式的集群实践&#xff0c;分享之。 2. 基于docker的集群实践 2.1 方案设计 - 两个已安装了d…

ICLR 2024 Spotlight|SEAL:面向真实场景超分辨率的系统性评估框架

研究背景 现实世界图像超分辨率&#xff08;Real-World Super-Resolution, Real-SR&#xff09;技术&#xff0c;作为提升图像清晰度的关键技术&#xff0c;正变得越来越重要。然而&#xff0c;如何准确评估Real-SR方法的性能&#xff0c;一直是该领域的一大挑战。目前的评估…

mig IP核的学习

mig全称是Memory Interface Generator。 参考自视频&#xff1a;MIG IP配置_哔哩哔哩_bilibili DDR基础知识 时钟类型 使用流程 选择DDR3 16是地址线的位宽 能在DDR3的型号MT41K256M16XX-125中看出来。 怎么选择clock period 靠的是 芯片型号中的 -125,然后算出 800MHZ,…