[华为OD]C卷 运输时间 200 动态规划

题目:

M辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为N。速度快的车追上前车 

后,只能以前车的速度继续行驶,求最后一车辆到达目的地花费的时间。

注意:

每辆车固定间隔1小时出发,比如第一辆车0时出发,第二辆车1时出发,依次类推.

输入描述

第一行两个数字:M、N,分别代表车辆数和到终点的距离,以空格分隔寸妾下来M行,每行1 

个数字S代表每辆车的速度

1< M < 20

1 < N < 400

0 < S < 30

输出描述

最后一辆车到达目的地花费的时间

示例1:

输入:

2 11

3

2

输出:

5.5

说明:

2辆车,距离11, 0时出发的车速度快,1时出发的车,达到目的地花费5.5

题解:

由于题目说了,速度快的车追上前车,会在追上前车时候按照前车速度继续行驶,那么这个时候,这个速度快的车就会和前车同时到达终点。

那么就有两种情况,追不上前车,那么对应时间就是s/v

追上前车,那么时间和前车一致。明显可以使用动态规划。dp[i]就是第i+1辆车到达终点的时间。

第一辆车dp[0] = s/v[0];

第i辆车 判断能追上,那么s/v[i] + 1< dp[i-1] ,因为第i辆车与前一辆车行驶时间差距1小时,所以有个-1,也就是前车耗时比后车多一个小时

此时dp[i] = dp[i-1]-1;

如果不能追上,那么dp[i] = s/v[i]

最后算出最后的dp[num-1]就可以了

代码:

import java.util.Scanner;

public class Speed {
 
华为OD考试作为华为公司用于选拔技术人才的一种方式,其不同试版本(如C)通常涵盖编程能力测试、算法理解与应用、以及实际问题解决能力的评估。虽然具体的题目和内容会根据实际情况进行调整,但整体结构和考察重点具有一定的规律性。 ### 考试内容解析 #### 1. **编程能力测试** 华为OD考试C通常包含多道编程题,主要考察候选人的编程能力和对常见数据结构与算法的掌握。题目类型可能包括数组操作、字符串处理、链表操作、树和图的遍历等。考试中要求使用一种或多种编程语言(如C++、Java、Python)实现算法,并确保代码的正确性和效率。 例如,一道典型的数组操作题目可能要求在给定的整数数组中查找满足特定条件的子数组或元素组合,并要求时间复杂度尽可能低。 #### 2. **算法理解与应用** 考试中会涉及常见的算法思想,包括但不限于贪心算法动态规划、深度优先搜索(DFS)、广度优先搜索(BFS)等。对于这些问题,除了写出正确的代码外,还要求理解算法时间复杂度和空间复杂度,并能根据题目要求进行优化。 例如,动态规划题目可能要求计算某个问题的最优解,如最长递增子序列(LIS)或背包问题。 #### 3. **实际问题解决能力** 华为OD考试还会设置一些贴近实际应用场景的问题,考察候选人分析问题、建模和解决问题的能力。这类题目通常需要将实际问题转化为标准的算法问题,并设计相应的解决方案。 例如,可能会要求设计一个调度算法来优化任务分配,或者设计一个系统来处理大规模数据。 ### 考试注意事项 - **熟悉编程环境**:建议提前熟悉考试平台的编程环境,避免因不熟悉操作而影响发挥。 - **注重代码质量**:代码不仅要正确运行,还需要具备良好的可读性和注释,以便于评审人员理解。 - **时间管理**:考试时间有限,合理分配时间,优先解决简单或熟悉的题目。 ### 刷题建议 根据华为OD考试的特点,建议按照算法分类进行刷题,例如: - **数组与字符串**:掌握常见的操作技巧,如双指针法、滑动窗口等。 - **链表与树**:熟练实现链表反转、树的遍历等操作。 - **动态规划**:理解状态转移方程的设计方法。 - **图论**:掌握图的遍历和最短路径算法。 ```python # 示例:动态规划解最长递增子序列(LIS) def length_of_lis(nums): if not nums: return 0 dp = [1] * len(nums) for i in range(len(nums)): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j] + 1) return max(dp) ``` ### 相关问题 1. 华为OD考试中动态规划题目的常见解法有哪些? 2. 如何高效准备华为OD考试中的编程题? 3. 华为OD考试中有哪些常见的数据结构应用场景?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值