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加群”

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【读书笔记】ICS设备及应用攻击(一)

工控系统通常是由互联设备所构成的大型复杂系统&#xff0c;这些设备包括类似于人机界面&#xff08;HMI&#xff09;、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件&#xff0c;软件为工控系统中几乎所有部分的运行提供支撑…

Docker笔记-搭建Python环境、安装依赖、打包镜像、导入镜像、编写bash脚本灵活调用

说明 适合无联网的机器及多Python的机器进行部署。 制作docker版Python环境 有网络及有docker的&#xff0c;拉取指定版本的python如&#xff1a; docker pull python:3.7 安装好后进入容器&#xff1a; docker run -it <name> /bin/bash 使用pip安装各种依赖&…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月17日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月17日 星期六 农历正月初八 1、 中疾控&#xff1a;我国自主研发的猴痘mRNA疫苗即将进入临床试验。 2、 2024年度总票房破100亿元&#xff0c;其中春节档已突破70亿元。 3、 国产大飞机首次国外亮相&#xff0c;C919已抵…

Harris关键点检测以及SAC-IA粗配准

一、Harris关键点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/keypoints/harris_3d.h> #include <pcl/visualization/pcl_visualizer.h> #include …

机器学习面试:请你谈谈逻辑回归的用法?

逻辑回归可用于以下几个方面: (1)用于概率预测。用于可能性预测时&#xff0c;得到的结果有可比性。比如根据模型进而预测在不同的自变量情况下&#xff0c;发生某病或某种情况的概率有多大。 (2)用于分类。实际上跟预测有些类似&#xff0c;也是根据模型&#xff0c;判断某人属…

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

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

嵌入式各种存储器的区别,NAND、DDR、LPDDR、eMMC

存储领域发展至今&#xff0c;已有很多不同种类的存储器产品。下面给大家介绍几款常见的存储器及其应用&#xff1a; 一、NAND NAND Flash存储器是Flash存储器的一种&#xff0c;属于非易失性存储器&#xff0c;其内部采用非线性宏单元模式&#xff0c;为固态大容量内存的实现…

2.12:C语言测试题

1.段错误&#xff1a;申请堆区内存未返回&#xff0c;str指向NULL 2.段错误&#xff1a;局部变量&#xff0c;本函数结束&#xff0c;p也释放 3.越界访问&#xff0c;可能正常输出hello&#xff0c;可能报错 4.可能段错误&#xff0c;释放后&#xff0c;str未指向NULL&#x…

sqlserver对已有的表插入列

现有如下的一个表&#xff1b; 现在要插入一个 人员id 列&#xff1b;如下图在设计视图的行首单击&#xff0c;选择 插入列&#xff1b; 然后添加一个 人员id 列&#xff1b; 保存&#xff0c;出现下图提示&#xff0c;不能保存设计&#xff1b; 这就直接使用sql语句更改&#…

活用 Composition API 核心函数,打造卓越应用(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

蓝桥省赛真题|简单:分数

题目链接&#xff1a;https://www.lanqiao.cn/problems/610/learning/?page1&first_category_id1&second_category_id3&tags2018&name%E5%88%86%E6%95%B0 题不难&#xff0c;但是可以帮助编程时好的习惯的养成&#xff0c;更加注意一些细节。 注意几个地方︰…

C++ STL->list模拟实现

theme: smartblue list list文档 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素…

solara,好用的 Python 太阳能系统的建模库!

🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️付费专栏:Python专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 大家好,今天为大家分享一个超级厉害的 Python 库 - solara。 Github地址:https://github.com/widgetti/solara 在可持续能源领域,太阳能是一种…

Github 2024-02-17 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-17统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目3Rust项目2Jupyter Notebook项目1PowerShell项目1JavaScript项目1 Black&#xff…

linux系统---防火墙

目录 一、防火墙的认识 1.防火墙定义 2.防火墙分类 二、Linux系统防火墙 1.Netfilter 2.防火墙工具介绍 2.1iptables 2.2firewalld 2.3nftables 2.4netfilter的五个勾子函数和报文流向 2.4.1五个勾子 2.4.2三种报文流向 3.iptables 3.1iptables概述 3.2iptables…

移动WEB开发知识总结

浏览器现状 PC端常见浏览器 360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器。 移动端常见浏览器 UC浏览器&#xff0c;QQ浏览器&#xff0c;欧朋浏览器&#xff0c;百度手机浏览器&#xff0c;360安全浏览器&#xff0c;谷歌浏览器&#xf…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

微信网页版能够使用(会顶掉微信app的登陆)

一、文件结构 新建目录chrome新建icons&#xff0c;其中图片你自己找吧新建文件manifest.json新建文件wx-rules.json 二、文件内容 对应的png你们自己改下 1、manifest.json {"manifest_version": 3,"name": "wechat-need-web","author…

揭开Markdown的秘籍:引用|代码块|超链接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Markdown指南、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️Markdown 引用1.1 &#x1f514;引用1.2 &#x1f514;嵌套引用1.3 &…

网络原理-TCP_IP(6)

网络层 在复杂的网络环境中确定一个合适的路径. IP协议 与TCP协议并列,都是网络体系中最核心的协议. 基本概念 主机:配有IP地址,但是不进行路由控制的设备; 路由器:即配有IP地址,又能进行路由控制; 节点:主机和路由器的统称; 协议头格式 4位版本号(version):指定IP协议的版…