华为OD机试真题 - 停车场车辆统计 - 贪心算法(Java/Python/JS/C/C++ 2024 D卷 200分)

本文主要是介绍华为OD机试真题 - 停车场车辆统计 - 贪心算法(Java/Python/JS/C/C++ 2024 D卷 200分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

特定大小的停车场,数组cars[]表示,其中1表示有车,0表示没车。车辆大小不一,小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3),统计停车场最少可以停多少辆车,返回具体的数目。

二、输入描述

整型字符串数组cars[],其中1表示有车,0表示没车,数组长度小于1000。

三、输出描述

整型数字字符串,表示最少停车数目。

四、测试用例

测试用例1:

1、输入

1,0,1

2、输出

2

3、说明

1个小车占第1个车位

第二个车位空

1个小车占第3个车位

最少有两辆车

测试用例2:

1、输入

1,1,0,0,1,1,1,0,1

2、输出

3

3、说明

1个货车占第1、2个车位

第3、4个车位空

1个卡车占第5、6、7个车位

第8个车位空

1个小车占第9个车位

最少3辆车

五、解题思路

1、贪心算法

贪心算法是一种在每一步选择中都采取当前最优策略,以期在全局达到最优解决方案的算法。

贪心算法适用哪些场景?
  1. 活动选择问题: 选择最多数量的互不重叠活动。
  2. 背包问题(可分割): 将物品装入背包以最大化总价值,但物品可以分割。
  3. 最小生成树: 例如Kruskal和Prim算法。
  4. 霍夫曼编码: 构建一个高效的前缀编码树。
  5. 贪心货币找零问题: 在某些货币系统中,使用最少的硬币找零。
  6. 区间覆盖: 选择最少数量的区间覆盖所有点。
  7. 图的染色问题: 某些图的染色问题可以用贪心算法解决。
贪心算法有哪些注意事项?

(1)局部最优不保证全局最优:

贪心算法每一步选择的都是当前最优解,但这不一定能保证最后得到的是全局最优解。

例如,在某些背包问题(不可分割的背包问题)中,贪心算法并不适用。

(2)问题是否具有贪心选择性质:

问题必须具有贪心选择性质,即从局部最优解可以推导出全局最优解。

例如,在活动选择问题中,选择最早结束的活动可以保证最多的活动数。

(3)可行性:

每一步选择必须是可行的,即它必须满足问题的约束条件。

例如,在图的染色问题中,每一步选择的颜色必须不同于相邻节点的颜色。

(4)子问题的最优解:

原问题的最优解包含其子问题的最优解,子问题之间不能有相互影响。

例如,在区间覆盖问题中,每次选择的区间必须最优地覆盖未覆盖的部分。

2、为什么采用贪心算法?

贪心算法的适用性

(1)局部最优解构建全局最优解:

我们希望在每个连续1的段落中使用尽可能少的车位。贪心算法通过每次选择最长的车(优先使用卡车,再是货车,最后是小车),确保每段连续的1使用最少数量的车。

例如,对于连续3个1的段落,使用一辆卡车是最优选择,而不是使用三辆小车。这种局部最优选择最终会构成全局最优解。

(2)问题的分段处理:

本题可以通过对每个独立的连续1段落单独处理来简化问题。每个段落可以独立计算所需的最少车数,然后将结果累加得到最终结果。

贪心算法在这种分段处理时表现良好,因为它不需要考虑段落之间的相互影响。

(3)简单且高效:

贪心算法的时间复杂度是O(n),其中n是数组的长度。只需一次遍历即可完成计算。

对于每段连续的1,贪心算法直接计算出所需的最少车数,而不需要复杂的动态规划或回溯算法。

3、具体步骤:

使用贪心算法来计算每个连续1段落所需的最少停车车数。

在计算每个连续1段落所需的最少停车车数时,优先选择最长的车(卡车长度为3),然后是中等长度的车(货车长度为2),最后是最短的车(小车长度为1)。这种策略确保我们以最少的车数覆盖所有连续的1段落。

六、Java算法源码

public class OdTest {public static int minParkingCars(int[] cars) {int n = cars.length;int minCars = 0;int i = 0;while (i < n) {if (cars[i] == 1) {int length = 0;while (i < n && cars[i] == 1) {length++;i++;}// 根据连续1的长度,计算最少需要的车数minCars += calculateMinCars(length);} else {i++;}}return minCars;}private static int calculateMinCars(int length) {int cars = 0;// 优先使用卡车(长度3)cars += length / 3;length %= 3;// 使用货车(长度2)cars += length / 2;length %= 2;// 剩余的使用小车(长度1)cars += length;return cars;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] cars = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int result = minParkingCars(cars);System.out.println(result); // 输出 3}
}

七、效果展示

1、输入

1,0,1,0,1,0,1

2、输出

4

3、说明

每个车位段落都只包含一个1,因此每个段落需要一辆小车来占据车位。

具体计算步骤如下:

第一个1段落需要1辆小车。
第二个1段落需要1辆小车。
第三个1段落需要1辆小车。
第四个1段落需要1辆小车。

因此,总的最少停车数为4。

在这里插入图片描述

八、Python算法源码

def min_parking_cars(cars):n = len(cars)min_cars = 0i = 0while i < n:if cars[i] == 1:length = 0while i < n and cars[i] == 1:length += 1i += 1# 根据连续1的长度,计算最少需要的车数min_cars += calculate_min_cars(length)else:i += 1return min_carsdef calculate_min_cars(length):cars = 0# 优先使用卡车(长度3)cars += length // 3length %= 3# 使用货车(长度2)cars += length // 2length %= 2# 剩余的使用小车(长度1)cars += lengthreturn carsdef main():cars = list(map(int, input().split(',')))result = min_parking_cars(cars)print(result)if __name__ == "__main__":main()

九、JavaScript算法源码

function minParkingCars(cars) {const n = cars.length;let minCars = 0;let i = 0;while (i < n) {if (cars[i] === 1) {let length = 0;while (i < n && cars[i] === 1) {length++;i++;}// 根据连续1的长度,计算最少需要的车数minCars += calculateMinCars(length);} else {i++;}}return minCars;
}function calculateMinCars(length) {let cars = 0;// 优先使用卡车(长度3)cars += Math.floor(length / 3);length %= 3;// 使用货车(长度2)cars += Math.floor(length / 2);length %= 2;// 剩余的使用小车(长度1)cars += length;return cars;
}function main() {const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim();const cars = input.split(',').map(Number);const result = minParkingCars(cars);console.log(result);
}// 如果在Node.js环境中运行,调用main函数
main();

十、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 计算最少需要的车数
int calculateMinCars(int length) {int cars = 0;// 优先使用卡车(长度3)cars += length / 3;length %= 3;// 使用货车(长度2)cars += length / 2;length %= 2;// 剩余的使用小车(长度1)cars += length;return cars;
}// 计算最少需要的车数来停放连续的车
int minParkingCars(int* cars, int n) {int minCars = 0;int i = 0;while (i < n) {if (cars[i] == 1) {int length = 0;while (i < n && cars[i] == 1) {length++;i++;}// 根据连续1的长度,计算最少需要的车数minCars += calculateMinCars(length);} else {i++;}}return minCars;
}int main() {char input[1000];fgets(input, sizeof(input), stdin);// 解析输入int cars[1000];int n = 0;char* token = strtok(input, ",");while (token != NULL) {cars[n++] = atoi(token);token = strtok(NULL, ",");}int result = minParkingCars(cars, n);printf("%d\n", result);return 0;
}

十一、C++算法源码

#include <iostream>
#include <sstream>
#include <vector>using namespace std;// 计算最少需要的车数
int calculateMinCars(int length) {int cars = 0;// 优先使用卡车(长度3)cars += length / 3;length %= 3;// 使用货车(长度2)cars += length / 2;length %= 2;// 剩余的使用小车(长度1)cars += length;return cars;
}// 计算最少需要的车数来停放连续的车
int minParkingCars(const vector<int>& cars) {int minCars = 0;int n = cars.size();int i = 0;while (i < n) {if (cars[i] == 1) {int length = 0;while (i < n && cars[i] == 1) {length++;i++;}// 根据连续1的长度,计算最少需要的车数minCars += calculateMinCars(length);} else {i++;}}return minCars;
}int main() {string input;getline(cin, input);// 解析输入vector<int> cars;stringstream ss(input);string token;while (getline(ss, token, ',')) {cars.push_back(stoi(token));}int result = minParkingCars(cars);cout << result << endl;return 0;
}

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

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

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

在这里插入图片描述

这篇关于华为OD机试真题 - 停车场车辆统计 - 贪心算法(Java/Python/JS/C/C++ 2024 D卷 200分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138762

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录