【最新华为OD机试E卷】查找充电设备组合(200分)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员

💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历

✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解

👏 感谢大家的订阅➕ 和 喜欢💗 和手里的小花花🌸

最新华为OD机试E卷目录,全、新、准,题目覆盖率达 95% 以上,其中D卷题目全部支持在线评测,E卷题目敬请期待

最新华为OD机试目录: https://www.nowcoder.com/share/jump/3022116661724989756887

🎀关于华为OD

  • ✨华为OD的概念 华为的大部分社会招聘采用了被称为OD(Outsourcing Dispatch)模式,这是一种与德科共同进行的招聘方式。在这种模式下,被招聘的员工通常被定级在13至17级,这些员工被视为华为的储备人才。华为每年会从这些OD项目中选拔表现出色的员工,并将他们转为正式员工。
  • ⌚️华为 OD 应聘流程
    • 第一步:投递简历

      • 提供姓名、邮箱、手机号、身份证号,用于锁定,所以投递前需要考虑清楚,投到项目组之后,一般不会转给另一个项目的 HR 了,也就是被锁定。
    • 第二步:机试

      • 3 道算法题,400 分满分,一般 1 个月的准备时间,华为机试必须要 150 分以上,没有过半年之后才能参加下一次考试。
    • 第三步:技术面

      • 2 轮技术面试。
    • 第四步:HR 与主管面试

    • 第五步:录用,发 offer

alt

🍓OJ题目截图

alt

🔌 查找充电设备组合

问题描述

某个充电站可提供 个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合 的 1 个元素。功率集合 的最优元素,表示最接近充电站最大输出功率 的元素。

输入格式

输入为 3 行:

  • 第 1 行为充电设备个数
  • 第 2 行为每个充电设备的输出功率。
  • 第 3 行为充电站最大输出功率

输出格式

输出功率集合 的最优元素。

样例输入 1

4
50 20 20 60
90

样例输出 1

90

样例解释 1

当充电设备输出功率 50、20、20 组合时,其输出功率总和为 90,最接近充电站最大充电输出功率,因此最优元素为 90。

样例输入 2

2
50 40
30

样例输出 2

0

样例解释 2

所有充电设备的输出功率组合,均大于充电站最大充电输出功率 30,此时最优元素值为 0。

数据范围

  • 充电设备个数
  • 最优元素必须小于或等于充电站最大输出功率

题解

这道题目本质上是一个变形的 0-1 背包问题。

我们需要从给定的充电设备中选择一些,使得它们的总功率最接近但不超过充电站的最大输出功率。

解题思路如下:

  1. 首先,我们可以使用动态规划来解决这个问题。创建一个数组 dp,其中 表示是否可以达到功率 i。

  2. 初始化 = true,因为总是可以达到 功率(不选择任何设备)。

  3. 遍历每个充电设备的功率,对于每个功率 power,更新 dp 数组:

    • 如果 为 true,那么 也应该为 true。
  4. 最后,从 开始向下遍历 dp 数组,找到第一个为 true 的索引,即为最优解。

时间复杂度分析:

  • 设充电站最大输出功率为 M,充电设备数量为 N。
  • 我们需要遍历每个充电设备(N次),对于每个设备,我们需要更新 dp 数组(最多 M 次)。
  • 因此,总的时间复杂度为 O(N * M)。

参考代码

  • Python
def solve(n, powers, p_max):
    # 初始化dp数组,dp[i]表示是否可以达到功率i
    dp = [False] * (p_max + 1)
    dp[0] = True  # 总是可以达到0功率
    
    # 遍历每个充电设备的功率
    for power in powers:
        # 从大到小遍历,避免重复计算
        for i in range(p_max, power - 1, -1):
            if dp[i - power]:
                dp[i] = True
    
    # 从p_max开始向下查找第一个为True的索引
    for i in range(p_max, -1, -1):
        if dp[i]:
            return i
    
    return 0  # 如果没有找到合适的组合,返回0

# 读取输入
n = int(input())
powers = list(map(int, input().split()))
p_max = int(input())

# 计算并输出结果
result = solve(n, powers, p_max)
print(result)
  • C
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int solve(int n, int* powers, int p_max) {
    // 动态分配内存给dp数组
    bool* dp = (bool*)calloc(p_max + 1, sizeof(bool));
    dp[0] = true;  // 总是可以达到0功率

    // 遍历每个充电设备的功率
    for (int j = 0; j < n; j++) {
        for (int i = p_max; i >= powers[j]; i--) {
            if (dp[i - powers[j]]) {
                dp[i] = true;
            }
     

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

最新华为OD机试-E+D卷 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD-E/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 部分题目提供OJ在线评测

全部评论

相关推荐

09-13 17:53
已编辑
黑龙江科技大学 iOS开发
题目描述单词接龙的规则是:可用于接龙的单词首字母必须要前一个单词的尾字母相同;当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,请输出最长的单词串,单词串是单词拼接而成,中间没有空格。输入描述输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0&nbsp;&lt;=&nbsp;K&nbsp;&lt;&nbsp;N&nbsp;;输入的第二行为一个非负整数,表示单词的个数N;接下来的N行,分别表示单词数组中的单词。输出描述输出一个字符串,表示最终拼接的单词串。补充说明单词个数N的取值范围为[1,&nbsp;20];单个单词的长度的取值范围为[1,&nbsp;30];用例1输入06worddddadcdwordd输出worddwordda说明:先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd,da,dc,则取字典序最小的da,所以最后输出worddwordda。用例2输入46worddddadcdwordd输出dwordda说明:先确定起始单词word,剩余以d开头且长度最长的有dd,da,dc,则取字典序最小的da,所以最后输出dwordda。解题如下:#include&nbsp;&lt;iostream&gt;#include&nbsp;&lt;vector&gt;#include&nbsp;&lt;string&gt;using&nbsp;namespace&nbsp;std;//&nbsp;判断是否可以接龙bool&nbsp;canChain(const&nbsp;string&amp;amp;&nbsp;a,&nbsp;const&nbsp;string&amp;amp;&nbsp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.back()&nbsp;==&nbsp;b.front();}int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;k,&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;k&nbsp;&gt;&gt;&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;string&gt;&nbsp;words(n);&nbsp;&nbsp;//&nbsp;存储单词列表&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;bool&gt;&nbsp;used(n,&nbsp;false);&nbsp;&nbsp;//&nbsp;标记单词是否已经使用过&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;++i)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;&gt;&gt;&nbsp;words[i];&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;result&nbsp;=&nbsp;words[k];&nbsp;&nbsp;//&nbsp;结果字符串以起始单词开始&nbsp;&nbsp;&nbsp;&nbsp;used[k]&nbsp;=&nbsp;true;&nbsp;&nbsp;//&nbsp;标记起始单词已使用&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(true)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;nextIndex&nbsp;=&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;n;&nbsp;++i)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;找到未使用的单词并且可以接龙&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!used[i]&nbsp;&amp;amp;&amp;amp;&nbsp;canChain(result,&nbsp;words[i]))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果没有选择单词或者当前单词比选择的单词更长或者相同长度但字典序更小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nextIndex&nbsp;==&nbsp;-1&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;words[i].length()&nbsp;&gt;&nbsp;words[nextIndex].length()&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(words[i].length()&nbsp;==&nbsp;words[nextIndex].length()&nbsp;&amp;amp;&amp;amp;&nbsp;words[i]&nbsp;&lt;&nbsp;words[nextIndex]))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextIndex&nbsp;=&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果没有找到可以接龙的单词,跳出循环&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nextIndex&nbsp;==&nbsp;-1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;words[nextIndex];&nbsp;&nbsp;//&nbsp;将选择的单词加入结果&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[nextIndex]&nbsp;=&nbsp;true;&nbsp;&nbsp;//&nbsp;标记该单词为已使用&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;输出最终拼接的单词串&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;result&nbsp;&lt;&lt;&nbsp;endl;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
查看1道真题和解析 投递华为等公司10个岗位
点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务