华为od机试真题 — 分披萨(Python)

news2024/11/15 10:21:05

alt

题目描述

“吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。

但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。

由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从“吃货”开始,轮流取披萨。

除了第-块披萨可以任意选取以外,其他都必须从缺口开始选。 他俩选披萨的思路不同。

“馋嘴”每次都会选最大块的拨萨,而且“吃货”知道“馋嘴”的想法。

已知披萨小块的数量以及每块的大小,求“吃货”能分得的最大的披萨大小的总和。

输入描述

第1行为一个正整数奇数 N ,表示披萨小块数量。其中 3 ≤ N< 500

接下来的第 2 行到第 N+1 (共 N 行),每行为一个正整数,表示第i块披萨的大小, 1≤iN

披萨小块从某一块开始,按照一个方向次序顺序编号为 1 ~ N ,每块披萨的大小范围为[1,2147483647]。

输出描述

”吃货“能分得到的最大的披萨大小的总和。

示例1

输入:
5
8
2
10
5
7

输出:
19

说明:
此例子中,有 5 块披萨。每块大小依次为 8 、2 、10 、5 、7。
按照如下顺序拿披萨,可以使”吃货拿到最多披萨:
“吃货”拿大小为 10 的披萨
“馋嘴”拿大小为5的披萨
“吃货”拿大小为7 的披萨
“馋嘴”拿大小为 8 的披萨
”吃货“拿大小为2 的披萨
至此,披萨瓜分完毕,”吃货“拿到的披萨总大小为 10+7+2=19
可能存在多种拿法,以上只是其中一种。

解题思路

解题思路

  1. 记忆化搜索:定义一个递归函数 f(l, r, t) 来表示从区间 [l, r] 里,“吃货”能分得的最大披萨大小的总和。这里 lr 分别表示区间的左边界和右边界,t 表示剩余的次数。
  2. 贪心选择:每次“馋嘴”都会选择当前区间内最大的披萨块,这会影响到下一步“吃货”的选择。因此,我们需要在“吃货”选择之前模拟“馋嘴”的贪心选择,以确保“吃货”能得到最大总和。
  3. 递归处理:递归地缩小问题规模,通过模拟“吃货”在每一步的选择,并记录下最优结果。

代码描述

  1. 输入处理:读取输入的披萨块数量 n 和每块披萨的大小。
  2. 缓存优化:使用 functools.cache 来缓存递归结果,避免重复计算。
  3. 递归函数 f
    • 参数:l 为左边界,r 为右边界,t 为剩余次数。
    • 基本情况:如果剩余次数 t 小于等于1,则返回0。
    • 贪心选择:模拟“馋嘴”选择当前区间内的最大披萨块,更新 lr
    • 动态规划选择:计算“吃货”选择左边界 l 或右边界 r 时的最大总和,并返回其中较大的值。
  4. 主逻辑:通过遍历每块披萨,计算“吃货”从该块披萨开始能得到的最大总和。

Python

from functools import cache

n = int(input())
pizza = list(int(input()) for _ in range(n))


@cache
def f(l: int, r: int, t: int) -> int:
    """
    :param l: 左边界
    :param r: 右边界
    :param t: 剩余次数
    :return: 返回 “吃货” 最优选择时可以分到的披萨总和
    """
    global n, pizza
    if t <= 1:
        return 0

    l, r = (l + n) % n, r % n

    # “馋嘴”选择最大的一块
    if pizza[l] >= pizza[r]:
        l = (l - 1 + n) % n
    else:
        r = (r + 1) % n
	
    # “吃货”选择 pizza[l]
    s1 = pizza[l] + f(l - 1, r, t - 2)
    # “吃货”选择 pizza[r]
    s2 = pizza[r] + f(l, r + 1, t - 2)
    return max(s1, s2)


print(max(pizza[i] + f(i - 1, i + 1, n - 1) for i in range(n)))

@cache 的作用和使用

作用

  • 性能优化:通过缓存函数的返回值,避免对相同输入的函数进行多次计算。
  • 简洁代码:使用装饰器的方式可以使代码更加简洁和易读。

使用方法

  • 在函数定义的上方添加 @cache 装饰器即可。

示例方法

from functools import cache

@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(50))

在上述例子中,fibonacci 函数使用了 @cache 装饰器。当计算 fibonacci(50) 时,fibonacci 函数会缓存所有中间结果,避免了大量重复计算,使得计算速度显著提升。

@cache@lru_cache 的区别

  • @cache

    • 缓存所有的函数调用结果,直到程序结束或缓存被手动清除。
    • 不限制缓存大小,可能会导致内存占用较大。
  • @lru_cache

    • Least Recently Used (LRU) 缓存,会限制缓存大小,默认最大缓存大小为 128,可以通过参数调整。
    • 当缓存满了,会自动清除最久未使用的缓存项,以保持缓存大小在设定范围内。
  • 示例代码

  from functools import lru_cache
  
  @lru_cache(maxsize=128)
  def fibonacci(n):
      if n < 2:
          return n
      return fibonacci(n - 1) + fibonacci(n - 2)
  
  print(fibonacci(50))
  

相关练习题

题号题目难易
LeetCode 486486. 预测赢家中等
LeetCode 464464. 我能赢吗中等

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open3d入门 点云拼接算法

点云拼接&#xff08;Point Cloud Stitching&#xff09;是将从不同视角或位置获取的多组点云数据对齐到同一个坐标系中的过程&#xff0c;以形成一个完整的三维模型。这项技术在计算机视觉、机器人导航、三维重建和无人驾驶等领域有着广泛的应用。 点云配准&#xff08;Point…

Qt 制作安装包

记录使用Qt工具制作一个安装包的过程 目录 1.准备工作 1.1检查Qt Installer Frameworks是否安装 1.2.安装Qt Installer Frameworks 1.3准备release出来的exe dll等文件 2.创建打包工程所需要的文件及目录 2.1创建子目录 2.2 创建工程文件 2.3 创建config/config.xml …

5.4 软件工程-系统设计

系统设计 - 概述 设计软件系统总体结构 数据结构及数据库设计 编写概要设计文档、评审 详细设计的基本任务 真题

HDU1011——Starship Troopers(树形DP),HDU1012——u Calculate e,HDU1013——Digital Roots

目录 HDU1011——Starship Troopers&#xff08;树形DP&#xff09; 题目描述 运行代码 代码思路 树形DP HDU1012——u Calculate e 题目描述 运行代码 代码思路 HDU1013——Digital Roots 题目描述 超时代码 改进后依旧超时代码 运行代码 代码思路 HDU1011——…

工时记录软件选型指南

国内外主流的10款工时计算软件对比&#xff1a;PingCode、Worktile、Tita、易企秀、奇鱼、Teambition、Timely、Toggl Track、RescueTime、ClickUp。 在忙碌的工作中&#xff0c;记录和管理工时常常是令人头疼的问题。工时记录软件的选择不仅能帮你省时省力&#xff0c;还能大幅…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时&#xff0c;一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找&#xff1f;许多视频创作者感叹&#xff0c;寻找理想的视频素材难度甚至超过了寻找伴侣&#xff01;但不用担心&#xff0c;今天我将为您介绍几个优质的视…

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展&#xff0c;移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢&#xff1f;UI设计师负责什么&#xff1f;UI设计的发展趋势和就业前景如何&#xff1f;这些都是许多…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组

文章目录 前言 序1&#xff1a;什么是内存&#xff1f; 序2&#xff1a;地址是怎么产生的&#xff1f; 一、指针是什么 1、指针变量的创建及其意义&#xff1a; 2、指针变量的大小 二、指针的解引用 三、指针类型存在的意义 四、野指针 1、什么是野指针 2、野指针的成因 a、指…

Unity客户端接入原生Google支付

Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试&#xff08;这个测试轨道过审最快&#xff09;&#xff0c;打包上传&#xff0c;这个包不需要接入支付&#xff0c;如果已…

机器人开源调度系统OpenTcs6-架构运行分析

系统启动 启动 Kernel&#xff1a;加载核心应用&#xff0c;初始化系统配置和状态。 启动 Plant Overview&#xff1a;加载图形用户界面&#xff0c;初始化模型和用户界面。 模型导入和配置 在 Plant Overview 中导入或创建工厂布局模型。 配置路径、位置和车辆信息。 车辆连…

用DrissionPage过某里滑块分析

最近我又在找工作了&#xff0c;悲哀啊~&#xff0c;面试官给了一道题&#xff0c;要求如下&#xff1a; 爬虫机试&#xff1a;https://detail.1688.com/offer/643272204627.html 过该链接的滑动验证码&#xff0c;拿到正确的商品信息页html&#xff0c;提取出商品维度的信息&a…

排序一次讲清(从冒泡到基数)

文章目录 冒泡原理代码pythonc 选择原理代码pythonc 插入原理代码pythonc 希尔原理代码pythonc 快排原理代码pythonc 归并原理代码pythonc 堆原理代码pythonc 计数原理代码pythonc 桶原理代码pythonc 基数原理代码pythonc 【待更新】 冒泡 原理 如果我们想要让数组从左至右从…

海豚调度器(DolphinScheduler)集群搭建详细笔记

海豚调度器集群搭建笔记 1.DolphinScheduler Cluster部署1.1 集群部署规划1.2 集群准备工作1.3 初始化数据库1.4 修改安装环境配置1.5 安装DolphinScheduler1.6 启停命令1.7 登录 DolphinScheduler UI 1.DolphinScheduler Cluster部署 分布式去中心化易扩展的工作流任务调度系…

【最强八股文 -- 计算机网络】TCP 四次挥手的过程及原因

第一次挥手&#xff1a;FIN 报文第二次挥手&#xff1a;ACK 报文第三次挥手&#xff1a;FIN 报文第四次挥手&#xff1a;ACK 报文 为什么需要四次挥手&#xff1f; 为什么需要 TIME_WAIT 状态&#xff1f; TIME_WAIT 的时间为什么是 2MSL&#xff1f;

springboot服务如何执行sql脚本文件

当sql脚本文件包含不同数据库实例sql时&#xff0c;遍历读取sql文件再插入时&#xff0c;由于是不同的数据库实例这种方式就不行了&#xff0c;这时就需要程序直接执行sql脚本。 springboot执行sql脚本 /*** 执行sql脚本* throws SQLException*/ private void executeSqlScri…

go-zero框架入门

go-zero框架环境的安装 goctl 若想用go-zero框架&#xff0c;还需要一些前置条件&#xff1a; 安装goctl go install github.com/zeromicro/go-zero/tools/goctllatest可以使用 goctl 命令查看是否安装成功 成功后安装protoc goctl env check --install --verbose --force…

重生奇迹MU 三代翅膀行情

在重生奇迹MU游戏中&#xff0c;达到400级以上的玩家都知道&#xff0c;重生奇迹大陆拍卖行里最值钱的物品是翅膀。翅膀可以分为一代、二代和三代翅膀&#xff0c;而其中价格最高的则是三代翅膀。有时候&#xff0c;三代翅膀的售价非常之高&#xff0c;甚至有市无价。这是因为三…

[论文笔记] CT数据配比方法论——1、Motivation

我正在写这方面的论文,感兴趣的可以和我一起讨论!!!!!! Motivation 1、探测原有模型的配比: 配比 与 ppl, loss, bpw, benchmark等指标 之间的关系。 2、效果稳定的配比:配比 与 模型效果 之间的规律。 Experiments 1、主语言(什么语言作为主语言,几种主语言?…

PyTorch 深度学习实践-逻辑斯蒂回归

视频指路 参考博客笔记 参考笔记二 用来分类的模型 说明&#xff1a;1、 逻辑斯蒂回归和线性模型的明显区别是在线性模型的后面&#xff0c;添加了激活函数(非线性变换) ​ 2、分布的差异&#xff1a;KL散度&#xff0c;cross-entropy交叉熵 现在损失函数衡量不是距离而是分布…