Wonderland - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

Wonderland 是小王居住地一家很受欢迎的游乐园。Wonderland目前有 4 种售票方式,分别为一日票(天)、三日票(3 天),周票( 7 天)和月票( 30 天) 。

每种售票方式的价格由一个数组给出,每种票据在票面时限内可以无限制地进行游玩。

例如:小王在第10日买了一张三日票,小王可以在第10日、第11日和第12日进行无限制地游玩,小王计划在接下来玩计划所需要地最低消费。

小王一年多次游玩该游乐园。小王计划地游玩日期将由一个数组给出。

现在,请您根据给出地售票价格数组和小王计划游玩日期数组,返回游玩计划所需要地最低消费。

输入描述

第一行为售票价格数组 costs ;

第二行为小王计划游玩日期数组;

costs.length = 4,默认顺序为一日票、三日票、周票和月票。

1 <= days.length <= 365,1 <= days[i]<= 365 ,默认顺序为升序。

输出描述

完成游玩计划的最低消费。

示例1

输入:
5 14 30 100
1 3 5 20 21 200 202 230输出:
40说明:
根据售票价格数组和游玩日期数组给出的信息,发现每次去玩的时候买一张一日票是最省钱的,所以小王会买 8 张一日票,每张 5 元,最低花费是 40 元。

题解

本题是一道典型的动态规划问题。

首先,我们可以创建一个长度为366 + 30 的数组dp,dp[x] 表示从计划游玩从第x到第365天的最低消费。

然后,从后往前遍历日期,根据游玩计划和售票价格数组进行动态规划转移。具体转移方程如下:

  1. 如果当前日期在计划游玩的日期中,那么可以选择购买一日票、三日票、周票或月票,分别更新dp[x]的值。
  2. 如果当前日期不在计划游玩的日期中,那么dp[x]等于dp[x+1],表示不购买任何票。

最终,dp[1]即为从第1天到第365天的最低消费。

Java

import java.util.Arrays;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 售票价格数组int[] costs = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();boolean[] days = new boolean[366];Arrays.fill(days, false);// 标记计划游玩的日期Arrays.stream(scanner.nextLine().split(" ")).map(Integer::parseInt).forEach(d -> days[d] = true);// dp[x] 表示从计划游玩 [x: 365] 日期最低消费// 为了方便动态规划转移,将数组扩展 30 个长度int[] dp = new int[366 + 30];Arrays.fill(dp, Integer.MAX_VALUE);for (int d = 366; d < dp.length; d++) dp[d] = 0;for (int x = 365; x > 0; x--) {if (days[x]) {  // 日期 x 计划游玩dp[x] = Math.min(dp[x], dp[x + 1] + costs[0]);  // 购买一日票dp[x] = Math.min(dp[x], dp[x + 3] + costs[1]);  // 购买三日票dp[x] = Math.min(dp[x], dp[x + 7] + costs[2]);  // 购买周票dp[x] = Math.min(dp[x], dp[x + 30] + costs[3]);  // 购买月票} else {dp[x] = dp[x + 1];}}System.out.println(dp[1]);}
}

Python

from cmath import inf# 售票价格数组
costs = list(map(int, input().split()))days = [False] * 366
for d in list(map(int, input().split())):days[d] = True# dp[x] 表示从 计划游玩 [x: 365] 日期最低消费
# 为了方便动态规划转移,将数组扩展 30 个长度
dp = [inf] * 366 + [0] * 30
for x in range(365, 0, -1):if days[x]:  # 日期 x 计划游玩dp[x] = min(dp[x], dp[x + 1] + costs[0])  # 购买一日票dp[x] = min(dp[x], dp[x + 3] + costs[1])  # 购买三日票dp[x] = min(dp[x], dp[x + 7] + costs[2])  # 购买周票dp[x] = min(dp[x], dp[x + 30] + costs[3])  # 购买月票else:dp[x] = dp[x + 1]print(dp[1])

C++

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <climits>using namespace std;template <typename T>
vector<T> readList() {string input;getline(cin, input);stringstream stream(input);vector<T> result;T value;while (stream >> value) {result.push_back(value);}return result;
}int main() {// 售票价格数组vector<int> costs = readList<int>();// 标记计划游玩的日期vector<bool> days(366, false);int day;while (cin >> day) {days[day] = true;}// dp[x] 表示从计划游玩 [x: 365] 日期最低消费// 为了方便动态规划转移,将数组扩展 30 个长度vector<int> dp(366 + 30, INT_MAX);fill(dp.begin() + 366, dp.end(), 0);for (int x = 365; x > 0; x--) {if (days[x]) {  // 日期 x 计划游玩dp[x] = min(dp[x], dp[x + 1] + costs[0]);  // 购买一日票dp[x] = min(dp[x], dp[x + 3] + costs[1]);  // 购买三日票dp[x] = min(dp[x], dp[x + 7] + costs[2]);  // 购买周票dp[x] = min(dp[x], dp[x + 30] + costs[3]);  // 购买月票} else {dp[x] = dp[x + 1];}}cout << dp[1] << endl;return 0;
}

相关练习题

题号题目难易
LeetCode 7070. 爬楼梯简单
LeetCode 5555. 跳跃游戏中等
LeetCode 4545. 跳跃游戏 II中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/472687.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌内部开发AI大语言模型“鹅”;OpenAI CEO 寻求大规模AI芯片全球生产投资

&#x1f989; AI新闻 &#x1f680; 谷歌内部开发AI大语言模型“鹅” 摘要&#xff1a;谷歌正在积极将AI技术融入其产品中&#xff0c;并为提升员工效率而开发了一个名为“鹅”的AI大语言模型。这一模型仅供公司内部团队使用&#xff0c;旨在辅助新产品的开发。据悉&#xf…

【优化数学模型】2. 动态规划DP方法的求解思路

【优化数学模型】2. 动态规划DP方法的求解思路 一、动态规划1. 概述2. 最优性原理3. 最优子结构特性 二、示例&#xff1a;0-1背包问题1. 问题描述2. 使用自顶向下的方法3. 使用自下而上的方法 一、动态规划 1. 概述 多阶段决策问题&#xff0c;就是要在允许的决策范围内&…

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…

沐编程APP免费下载|获取免费项目以及技术教程

软件介绍 沐编程专注于分享IT编程相关知识的网站&#xff0c;主要分享毕业设计案例代码&#xff0c;课程设计案例代码&#xff0c;实用功能代码&#xff0c;bug解决方案&#xff0c;编程工具推荐以及编程课程分享等 下载方式 蓝奏云下载&#xff1a;https://wfr.lanzout.com…

C语言学习day15:数组强化训练

题目一&#xff1a; 称体重&#xff1a;分别给10个值&#xff0c;来获得最大值 思路&#xff1a; 定义数组&#xff0c;给数组内赋10个值第一个下标的值与第二个下标的值进行比较定义max&#xff0c;将比较得来的较大的值赋值给max一直比较直到比较到最后一个下标&#xff0…

回溯题中借助哈希法来巧妙去重的操作

今天总结一下回溯法以来做过的这些题&#xff0c;我又发现一个困扰了我的问题&#xff0c;就是在491. 非递减子序列、46. 全排列、47. 全排列 II中都有涉及到用哈希法&#xff0c;去记录曾经用过的元素&#xff0c;下面来总结一下吧。 首先得知道&#xff0c;为什么会用到哈希法…

BulingBuling - 《研究巴菲特》 [ Buffettology ]

研究巴菲特 使沃伦-巴菲特成为世界上最著名的投资者的那些以前未曾解释过的技术 作者&#xff1a;玛丽-巴菲特 Buffettology The Previously Unexplained Techniques That Have Made Warren Buffett The Worlds Most Famous Investor By Mary Buffett 内容提要 《Buffetto…

机器学习中7种常用的线性降维技术总结

上篇文章中我们主要总结了非线性的降维技术&#xff0c;本文我们来总结一下常见的线性降维技术。 1、Principal Component Analysis (PCA) Principal Component Analysis (PCA) 是一种常用的降维技术&#xff0c;用于将高维数据集转换为低维表示&#xff0c;同时保留数据集的…

如何打开Windows 10及更低版本系统的控制面板?这里提供详细步骤

Windows中的控制面板是一组小程序,有点像小程序,可以用来配置操作系统的各个方面。 例如,“控制面板”中的一个小程序允许你配置鼠标指针的大小(以及其他内容),而另一个则允许你调整所有与声音相关的设置。 其他小程序可用于更改网络设置、设置存储空间、管理显示设置等…

什么是位段?位段的作用是什么?他与结构体有什么关系?

目录 1.什么是位段&#xff1f; 2.位段的内存分配 判断当前机器位段的内存分配形式 1.什么是位段&#xff1f; 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 1.位段的成员必须是 int、unsigned int 或signed int或char 。 2.位段的成员名后边有一个冒号和…

基于RTOS的嵌入式软件开发与可靠性提升

&#xff08;本文为简单介绍&#xff0c;观点来自网络&#xff09; 随着科技的快速发展&#xff0c;嵌入式系统无所不在&#xff0c;从你的智能手表到汽车的自动驾驶系统&#xff0c;它们都在静静地改变我们的世界。而在这一切的背后&#xff0c;实时操作系统&#xff08;RTOS&…

CTFshow web(文件上传158-161)

web158 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&#xff0c;自动加载并执行指定的文件。 这…