2023 华为笔试 华为笔试题 华为留学生笔试 0921

笔试时间:2023年9月21日 秋招

备注:第三题题干不全暂无题解

第一题

题目:开电动汽车回家过年

新年即将来临,小明计划开新买的电动汽车回老家过年。已知小明的工作地在上海,老家在中部某城市A。上海到城市A的距离是L公里(1<=L≤100000)。小明的电动汽车的电池航程是P,电池最大电量也是P(假设电动汽车行使一公里需要消耗1度电。(1<=P<=100))。如果电动车在中途电量耗尽了,将无法继续强行,也就无法到达目的地了。已知小明出发前已经把电池充满了。途中依次经过N(1<=N<10000)个充电站。第i个充电站距离城市A有 Ai公里,最大可充电 Bi度。请问,小明能不能顺利地回老家过年?如果可以,请输出最少需要充电多少次;如果不可以,请输出-1。

解答要求:时间限制: C/C++ 1000ms, 其他语言: 2000ms内存限制: C/C++ 256MB,其他语言: 512MB。

输入描述

输入的第一行为数字N;

接下来的N行,每行包含2个数并用空格隔开: Ai Bi;

最后一行包括两个数LP,并用空格隔开。

输出描述

按照题目要求输出最少次数或者-1。

样例输入

4

4 4

5 5

11 6

15 8

25 10

样例输出

3

解释

小明出发时电池电量是10,距离城市A 25公里。

行驶10公里后,到达距离城市A 15公里的充电站,充点前电池电量为0,充电8度之后,再出发。

行驶4公里后,到达距离城市A11公里的充电站,充电前电池电量为4。充电6度之后,再出发。

行驶6公里后,到达距离城市A 5公里的充电站,充电前电池电量为4,充电1度之后,再出发。

之后,可以直接开到城市A,一共需要充电3次才能到达城市A。

参考题解

动态规划+记忆化搜索。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>

using namespace std;

int solve(int N, vector<pair<int, int>> &stations, int L, int P) {
    sort(stations.begin(), stations.end());
    stations.insert(stations.begin(), make_pair(0, 0));

    function<int(int, int)> dfs = [&](int i, int j) -> int {
        if (i == N) {
            int diff = L - stations[N].first;
            if (j >= diff) return 0;
            if (j + stations[N].second >= diff) return 1;
            return INT_MAX;
        }
        int diff = stations[i + 1].first - stations[i].first;
        int ans = INT_MAX;
        if (j >= diff) {
            ans = min(ans, dfs(i + 1, j - diff));  // 不充电
        }

        if (j + stations[i].second >= diff) {
            int curP = min(j + stations[i].second, P);  // 防止充爆
            ans = min(ans, dfs(i + 1, curP - diff) + 1);
        }
        return ans;
    };

    int ans = dfs(0, P);
    if (ans == INT_MAX) return -1;
    return ans;
}

int main() {
    int N, L, P;
    cin >> N;
    vector<pair<int, int>> stations(N);
    for (int i = 0; i < N; i++) {
        cin >> stations[i].first >> stations[i].second;
    }
    cin >> L >> P;

    int result = solve(N, stations, L, P);
    cout << result << endl;
    return 0;
}

Python:[此代码未进行大量数据的测试,仅供参考]

from math import inf

def solve(N, stations, L, P):
    stations.sort(key=lambda x: x[0])
    stations = [[0, 0]] + stations

    def dfs(i, j):
        if i == N:
            diff = L - stations[-1][0]
            if j >= diff:
                return 0
            if j + stations[-1][1] >= diff:
                return 1
            return inf
        diff = stations[i + 1][0] - stations[i][0]
        ans = inf
        if j >= diff:
            ans = min(ans, dfs(i + 1, j - diff))  # 不充电

        if j + stations[i][1] >= diff:
            curP = min(j + stations[i][1], P)  # 防止充爆
            ans = min(ans, dfs(i + 1, curP - diff) + 1)
        return ans

    ans = dfs(0, P)
    if ans == inf:
        return -1
    return ans

if __name__ == "__main__":
    N = int(input())
    stations = []
    for _ in range(N):
        stations.append([int(c) for c in input().split()])

    L, P = map(int, input().split())

    result = solve(N, stations, L, P)
    print(result)

第二题

题目:查询节点路径

树的节点有三个属性:节点名称、节点ID,节点的父级节点ID。同一个父级节点下的所有子节点名称不会重复,但节点名称在全局可能重复。节点名称中不包含 / 字符,节点的id全局唯一,如果节点是树的根节点,则其父级节点1D的约定为-1,可以使用节点路径唯一标识一个节点在树中的位置。节点路径生成方式是:从树的根节点开始,找出到目标节点所经过的所有节点,然后将这些节点名称、用/字符分隔拼接而成。请实现树的节点查询功能:根据指定节点名称,返回查询出的所有节点路径。

解答要求:时间限制: C/C++1000ms,其他语言: 2000ms内存限制: C/C++ 256MB,其他语言:512MB

输入描述

标准IO输入。

第一行为要查询的节点名称。

第二行为节点名称序列,名称间使用逗号分隔。序列的序号即为节点id,序号从0开始。节点总数小于1024。

第三行为每个节点的父级节点的id。根节点的父级id约定为:-1

输出描述

输出一个整数,表示最少的操作次数。返回搜索到的所有节点的路径。

如果查询出多条路径,则按照路径的字典序从小到大排序后输出,逗号分隔。如果搜索结果为空,则输出 null。

样例输入

c

a,b,c,d,c

-1,0,1,0,3

样例输出

/a/b/c,/a/d/c

参考题解

dfs+回溯。总体来说就是先建树, 然后树上找路径。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

int main() {
    string target;
    cin >> target;
    cin.ignore(); // Consume newline character

    string names_str;
    getline(cin, 

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论
老哥是港大的吗,我听说香港是并入国内的池子
点赞 回复 分享
发布于 2023-11-01 13:10 广东

相关推荐

11-13 12:02
门头沟学院 Java
我要娶个什么名:好骂,好骂 别学计算机就行了
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务