【秋招笔试-试读版】9.11华子秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导

✨ 本系列打算持续跟新 春秋招笔试题

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

✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试

在这里插入图片描述

目前今年秋招的笔试已经全面上线OJ啦!!!

已经订阅专栏的小伙伴可以联系我解锁评测权限

OJ使用相关请戳:OJ使用相关

alt

🍠 华子秋招笔试,来啦!!!

🍥 本次华子是DP专场,没有了之前的阅读理解+大模拟,还是比较 nice

1️⃣ 基础 BFS 的拓展版,不难

2️⃣ 排序+动态规划,LIS的多维拓展问题,但由于这里值域和 n n n 都比较小,可以直接暴力 dp

3️⃣ 非常经典的线性DP了,本质是 区间调度 问题,这个知识点考了许多次,本题需要类似建图的思想来优化。

🪐 01.K小姐的管理计划

评测链接🔗

问题描述

在一个美丽的小区里,K小姐每天都要处理居民们产生的生活垃圾。为了确保垃圾能够及时处理,她需要将这些垃圾运输到最近的垃圾回收站。小区和垃圾回收站都分布在一个 m m m n n n 列的区域矩阵中,居民区、垃圾回收站、空白区域和障碍物分别用不同的数字表示。K小姐希望计算出将所有小区的垃圾送到垃圾回收站的最小距离总和。

在这个区域矩阵中:

  • 0 0 0 表示垃圾回收站
  • 1 1 1 表示小区
  • 2 2 2 表示空白区域
  • − 1 -1 1 表示障碍区域(不可通行)

如果区域内没有小区或者垃圾回收站,则返回 0 0 0。无法到达垃圾回收站的小区也不计入距离和。

输入格式

第一行包含两个数字 m m m n n n,表示区域矩阵的行数和列数,中间用空格分隔, m m m n n n 的范围均为 [ 1 , 300 ] [1, 300] [1,300]

接下来的 m m m 行表示一个 m × n m \times n m×n 的区域矩阵数组,每行的元素间以空格分隔,其中元素取值仅为 − 1 -1 1(障碍区域)、 0 0 0(垃圾处理站)、 1 1 1(小区)、 2 2 2(空白区域)。

输出格式

输出一个整数,表示所计算的最小距离和。

样例输入

4 4
1 2 -1 1
2 0 2 0
2 2 -1 2
1 2 1 1

样例输出

11

数据范围

  • 区域矩阵的行数和列数均在 [ 1 , 300 ] [1, 300] [1,300] 范围内。

题解

基础的BFS

需要在一个矩阵中找到所有垃圾回收站的位置,然后从这些位置开始,向周围的区域扩展,寻找可以到达的小区。

  1. BFS:从所有垃圾回收站出发,将它们的初始距离设为 0 0 0,然后逐层向外扩展,直到所有可达的小区都被访问到。

  2. 处理障碍物:在扩展过程中,需要注意障碍物( − 1 -1 1)的存在,确保不会访问到这些区域。

  3. 计算距离和:对于每个小区,记录到垃圾回收站的最短距离,并将这些距离累加,得到最终的结果。

  4. 时间复杂度:由于 BFS 会遍历整个矩阵,时间复杂度为 O ( m × n ) O(m \times n) O(m×n),对于最大 300 × 300 300 \times 300 300×300 的矩阵来说是可以接受的。

参考代码

🔒订阅专栏解锁参考代码以及评测功能 → \to 🧷华为春秋招笔试

🎁 02.LYA的礼物塔

评测链接🔗

问题描述

LYA是一位热爱艺术的设计师。圣诞节前夕,她收到了许多来自朋友的礼物盒。这些礼物盒大小各不相同,LYA突发奇想,想要用这些盒子搭建一座"礼物塔"。

她的构想是这样的:每个盒子都可以用长、宽、高三个数字来描述。在搭建过程中,上面的盒子在长、宽、高三个维度上都必须严格小于下面的盒子。LYA希望能够搭建出最高的礼物塔,塔的高度等于所有使用的盒子高度之和。

现在,LYA需要你的帮助来计算出她能搭建的最高礼物塔的高度。

输入格式

第一行包含一个正整数 N N N,表示礼物盒的数量。

接下来的 N N N 行,每行包含三个正整数 L i L_i Li W i W_i Wi H i H_i Hi,分别表示第 i i i 个礼物盒的长、宽和高。

输出格式

输出一个整数,表示LYA能搭建的最高礼物塔的高度。

样例输入

4
1 1 1
2 3 4
3 6 7
4 5 6

样例输出

12

样例解释

LYA可以选择3个盒子来搭建礼物塔:(1,1,1)、(2,3,4)和(3,6,7)。这样搭建的礼物塔高度为1+4+7=12,是所有可能方案中最高的。

数据范围

  • 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1N1000
  • 1 ≤ L i , W i , H i ≤ 10 1 \leq L_i, W_i, H_i \leq 10 1Li,Wi,Hi10

题解

这道题目本质上是一个动态规划问题,类似于最长递增子序列(LIS)的变种。

我们需要在三个维度上都满足严格递增的条件,同时最大化高度和。

解题思路如下:

  1. 首先,可以对所有礼物盒按照任意一个维度(比如长度)进行排序。这样可以保证至少一个维度是递增的。

  2. 定义 dp[i] 表示以第 i 个盒子为底的最大高度和。

  3. 对于每个盒子 i,需要检查在它之前的所有盒子 j。如果盒子 j 在所有三个维度上都严格小于盒子 i,那么可以考虑将盒子 i 放在盒子 j 上面。

  4. 状态转移方程为:
    d p [ i ] = m a x ( d p [ i ] , d p [ j ] + h e i g h t [ i ] ) dp[i] = max(dp[i], dp[j] + height[i]) dp[i]=max(dp[i],dp[j]+height[i]),其中 j 是满足条件的所有盒子。

  5. 最后,dp 数组中的最大值就是我们能搭建的最高礼物塔的高度。

时间复杂度分析:排序需要 O ( N log ⁡ N ) O(N \log N) O(NlogN),动态规划过程需要 O ( N 2 ) O(N^2) O(N2),因此总的时间复杂度是 O ( N 2 ) O(N^2) O(N2)。对于 N ≤ 1000 N \leq 1000 N1000 的数据范围,这个复杂度是可以接受的。

参考代码

🔒订阅专栏解锁参考代码以及评测功能 → \to 🧷华为春秋招笔试

🎶 03.LYA的音乐节策划

评测链接🔗

问题描述

LYA是一位著名的音乐节策划人。她正在为一个线性音乐节场地制定演出计划。这个场地由 N N N 个连续的舞台组成,从左到右编号为 1 到 N N N

LYA收到了 M M M 个乐队的演出申请,每个申请都包含三个信息:起始舞台编号、结束舞台编号和预期收益。如果接受某个乐队的申请,那么从起始到结束的所有舞台都将被该乐队占用,其他乐队就不能再使用这些舞台。

LYA的目标是在保证不同乐队演出不冲突的前提下,制定一个能够使总收益最大化的演出计划。请你帮助LYA计算出这个最大收益。

输入格式

第一行包含一个正整数 N N N,表示舞台的数量。

第二行包含一个正整数 M M M,表示收到的演出申请数量。

接下来的 M M M 行,每行包含三个整数 K 1 K_1 K1 K 2 K_2 K2 R R R,分别表示某个乐队申请的起始舞台编号、结束舞台编号和预期收益。

输出格式

输出一个整数,表示能够获得的最大总收益。

样例输入1

5
2
1 5 4
2 4 8

样例输出1

8

样例输入2

5
2
1 5 4
2 4 1

样例输出2

4

样例输入3

20
6
1 6 1
3 10 2
10 12 3
11 12 2
12 15 2
13 18 1

样例输出3

5

样例解释

对于样例1,LYA选择了第二个申请(2-4舞台,收益8),因为它能带来更高的收益。

对于样例2,LYA选择了第一个申请(1-5舞台,收益4),因为它覆盖了所有舞台并带来更高的收益。

对于样例3,LYA可以选择以下申请组合:

  • 3-10舞台,收益2
  • 11-12舞台,收益2
  • 13-18舞台,收益1
    总收益为2+2+1=5。

数据范围

  • 1 ≤ N ≤ 10000 1 \leq N \leq 10000 1N10000
  • 1 ≤ M ≤ 100000 1 \leq M \leq 100000 1M100000
  • 1 ≤ K 1 < K 2 ≤ N 1 \leq K_1 < K_2 \leq N 1K1<K2N
  • 1 ≤ R ≤ 100 1 \leq R \leq 100 1R100

题解

本质上是一个区间调度问题,可以用动态规划来解决。

首先,需要理解问题的核心:在不冲突的情况下,选择能够带来最大收益的演出组合。

考虑到每个演出都有起始和结束的舞台,可以将问题看作是在一条数轴上选择不重叠的区间,使得这些区间的价值和最大。

我们采用记忆化搜索的方式来实现该题

状态定义: 可以定义 d p [ i ] dp[i] dp[i] 为考虑第 i ∼ n i \sim n in 个舞台时能获得的最大收益。

对于每个舞台$ i$,我们有两种选择:

  • 不接受任何在此舞台开始的演出申请,那么最大收益就是 d p [ i + 1 ] dp[i + 1] dp[i+1]
  • 接受某个在此舞台开始的演出申请,那么最大收益就是 该演出的收益 + dp[该演出结束舞台的下一个舞台]

这里数据范围比较大,对于每个区间可以连一条 k 1 → k 2 k1 \to k2 k1k2 的边

因此,状态转移方程可以表示为:
d p [ k 1 ] = m a x ( d p [ k 1 + 1 ] , m a x ( r + d p [ k 2 + 1 ] ) ) dp[k1] = max(dp[k1 + 1], max(r + dp[k2+1] )) dp[k1]=max(dp[k1+1],max(r+dp[k2+1]))

参考代码

🔒订阅专栏解锁参考代码以及评测功能 → \to 🧷华为春秋招笔试

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春秋招笔试突围

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值