分披萨 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

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
可能存在多种拿法,以上只是其中一种。

题解

解题思路: 记忆化搜索算法,计算“吃货”在每一轮中的最佳选择。使用二维缓存数组 cache 来存储中间结果,避免重复计算。

代码描述:

  1. 定义 get_max_sum 函数,表示在给定可选的左右边界索引和剩余披萨块数,吃货能分到的最大披萨总和。
  2. get_max_sum 函数中,首先对左右边界进行调整(避免数组越界),“馋嘴”选择最大的一块。
  3. 使用递归计算( “吃货”)两种情况下的最大总和:选择左边界块和选择右边界块。
  4. 返回最优解并将结果缓存到 cache 中,避免重复计算。
  5. 在主函数中,尝试每种选择,然后取结果最大的值。

Java

import java.util.Arrays;
import java.util.Scanner;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] p = new int[n];for (int i = 0; i < n; i++) p[i] = in.nextInt();Solution solution = new Solution();System.out.println(solution.solve(p, n));}
}class Solution {int n;int[] p;long[][] cache;/*** @param l, r: 可以选择的两端索引下标* @param t: 剩余的披萨块数* @return: 返回 “吃货” 最优选择时可以分到的披萨总和*/private long getMaxSum(int l, int r, int t) {if (t <= 1) return 0L;l = (l + n) % n;r = r % n;// “馋嘴” 选择最大的一块if (p[l] >= p[r]) {l = (l - 1 + n) % n;} else {r = (r + 1) % n;}if (cache[l][r] != -1) return cache[l][r];long s1 = p[l] + getMaxSum(l - 1, r, t - 2);    // “吃货” 选择 p[l]long s2 = p[r] + getMaxSum(l, r + 1, t - 2);    // “吃货” 选择 p[r]// “吃货” 选择最有利的,并返回结果return cache[l][r] = Math.max(s1, s2);}public long solve(int[] p, int n) {this.p = p;this.n = n;this.cache = new long[n][n];Arrays.stream(cache).forEach(row -> Arrays.fill(row, -1));long maxsum = 0;for (int i = 0; i < n; i++) {maxsum = Math.max(maxsum, p[i] + getMaxSum(i - 1, i + 1, n - 1));}return maxsum;}
}

Python

def get_max_sum(l, r, t):""":param l: 左边界:param r: 右边界:param t: 剩余次数:return: 返回 “吃货” 最优选择时可以分到的披萨总和"""global n, p, cacheif t <= 1:return 0l, r = (l + n) % n, r % n# “馋嘴”选择最大的一块if p[l] >= p[r]:l = (l - 1 + n) % nelse:r = (r + 1) % nif cache[l][r] != -1:return cache[l][r]# “吃货”选择 p[l]s1 = p[l] + get_max_sum(l - 1, r, t - 2)# “吃货”选择 p[r]s2 = p[r] + get_max_sum(l, r + 1, t - 2)# “吃货”选择最大的一块,并返回结果cache[l][r] = max(s1, s2)return cache[l][r]if __name__ == "__main__":n = int(input())p = list(int(input()) for _ in range(n))cache = [[-1] * n for _ in range(n)]# “吃货”尝试每种选择,然后取结果最大的值maxsum = max(p[i] + get_max_sum(i - 1, i + 1, n - 1) for i in range(n))print(maxsum)

C++

#include <bits/stdc++.h>
using namespace std;int n;
vector<int> p;
vector<vector<long long>> cache;/*** * @param l, r: 可以选择的两端索引下标* @param t: 剩余的披萨块数* * @return: 返回 “吃货” 最优选择时可以分到的披萨总和
*/
long long get_max_sum(int l, int r, int t){if(t <= 1) return 0LL;l = (l + n) % n;r = r % n;// “馋嘴” 选择最大的一块if(p[l] >= p[r]){l = (l - 1 + n) % n;}else{r = (r + 1) % n;}if(cache[l][r] != -1) return cache[l][r];// “吃货” 选择 p[l]long long s1 = p[l] + get_max_sum(l - 1, r, t - 2);// “吃货” 选择 p[r]long long s2 = p[r] + get_max_sum(l, r + 1, t - 2);// “吃货” 选择最大的一块,并返回结果return cache[l][r] = max(s1, s2);
}int main(){cin >> n;p.resize(n);cache.resize(n, vector<long long>(n, -1));for(int i = 0; i < n; i++) cin >> p[i];long long maxsum = 0;//  “吃货” 尝试每种选择,然后取结果最大的值for(int i = 0; i < n; i++){maxsum = max(maxsum, p[i] + get_max_sum(i - 1, i + 1, n - 1));}cout << maxsum << endl;return 0;
}    

相关练习题

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

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

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

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

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

相关文章

【c语言】字符函数和字符串函数(上)

前言 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 1. 字符分…

@ 代码随想录算法训练营第9周(C语言)|Day62(单调栈)

代码随想录算法训练营第9周&#xff08;C语言&#xff09;|Day62&#xff08;单调栈&#xff09; Day25、回溯&#xff08;包含题目 739. 每日温度 496.下一个更大元素 I &#xff09; 739. 每日温度 题目描述 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置…

前端有哪些实现埋点、性能监控、告警的方式

前端错误监控&#xff1a; 通过监控前端错误来捕获客户端的异常和错误。可以使用第三方服务如Sentry、Bugsnag、Rollbar等&#xff0c;或者自行实现错误监控系统。 性能监控&#xff1a; 监控页面加载时间、资源加载时间、渲染时间等性能指标&#xff0c;以及页面的可交互性能…

Vue 卸载eslint

卸载依赖 npm uninstall eslint --save 然后 进入package.json中&#xff0c;删除残留信息。 否则在执行卸载后&#xff0c;运行会报错。 之后再起项目。

pthread_exit和pehread_join函数

pthread_exit&#xff1a; 在线程中禁止调用exit函数&#xff0c;否则会导致整个进程退出&#xff0c;取而代之的是调用pthread_exit函数&#xff0c;这个函数只会使一个线程退出&#xff0c;如果主线程使用pthread_exit函数也不会使整个进程退出&#xff0c;不会影响其他线程…

扫描TestNG框架编写的自动化用例确认其中是否包含断言的方法

在测试工作中&#xff0c;要确认TestNG框架编写的自动化用例中是否包含断言&#xff0c;我们可以使用一些静态代码分析工具。静态代码分析工具可以在不执行代码的情况下检查代码&#xff0c;发现可能的错误、代码异味或者不符合编码规范的地方。对于TestNG框架&#xff0c;一种…

Python元组详细教程

Python中的元组&#xff08;tuple&#xff09;是一种不可变的有序序列类型&#xff0c;用于存储多个值。由于元组是不可变的&#xff0c;因此你不能修改元组中的元素&#xff0c;但你可以访问和操作元组中的元素。 创建元组 你可以使用圆括号 () 来创建元组&#xff0c;元组中…

新媒体运营-定位及呈现方式篇

常见呈现方式:真人口述、小剧情、记录(边走边说)、Vlog+场景、画外音+场景、视频/图+文案 标题 是写给潜在客户看的, 内容 是给我们的目标用户看的。 01 要有核心内容 写文案从模仿开始,依样画葫芦 然后形成一套顺手的体系公式 02 要方便用户搜索 关键词、话题、连带关联词…

【JavaScript 漫游】【022】事件模型

文章简介 本篇文章为【JavaScript 漫游】专栏的第 022 篇文章&#xff0c;对 JavaScript 中事件模型相关的知识点进行了总结。 监听函数 浏览器的事件模型&#xff0c;就是通过监听函数&#xff08;listener&#xff09;对事件做出反应。事件发生后&#xff0c;浏览器监听到…

2.23日学习打卡----初学Nginx(二)

2.23日学习打卡 目录: 2.23日学习打卡一. Nginx 虚拟主机虚拟主机的分类Nginx支持三种类型的虚拟主机配置Nginx虚拟主机单网卡多IP配置Nginx虚拟主机_基于域名虚拟主机配置Nginx虚拟主机基于多端口的配置4 二. Nginx 核心指令root和alias指令的区别return指令rewrite指令rewrit…

MySQL-行转列,链接查询

1. 行转列 1.1 示例数据准备 create table test_9(id int,name varchar(22),course varchar(22),score decimal(18,2) ); insert into test_9 (id,name,course,score)values(1,小王,java,99); insert into test_9 (id,name,course,score)values(2,小张,java,89.2); inse…

【MATLAB源码-第148期】基于matlab的BP神经网络2/4ASK,2/4FSK,2/4PSK信号识别仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 调制技术基础 调制技术是通信技术中的基础&#xff0c;它允许数据通过无线电波或其他形式的信号进行传输。调制可以根据信号的振幅、频率或相位的变化来进行&#xff0c;分别对应于ASK、FSK和PSK。 1.1 2ASK与4ASK 振幅…

西宾视频下载工具(mediadown)

一个支持多网站的视频下载工具。目前已经支持的网站有知乎、哔哩哔哩、得到、猫耳、蜻蜓FM。 西宾视频下载工具能够帮助你下载知乎知学堂、哔哩哔哩、得到课程、猫耳音频、蜻蜓FM的音视频文件。如果你是这些网站的会员&#xff0c;它还能帮你下载会员节目的音视频。 工具也不是…

【大厂AI课学习笔记NO.54】2.3深度学习开发任务实例(7)数据标注和数据集拆分

数据标注 有时我们会把特征工程和数据集的标注弄混淆&#xff0c;在普通的机器学习项目中&#xff0c;我们需要进行特征工程&#xff0c;但是在深度学习项目过程中&#xff0c;我们需要进行数据标注工作。 标注工具 在本案例中&#xff0c;使用的是开源的标注工具Labelme&am…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…

Elasticsearch 创建index库 timeout

问题概述 使用 python 客户端 代码进行创建,【之前成功创建,但是现在出现报错,报错代码es_connection.client.indices.create】def create_vector_index(dataset_index_name,vector_query_field,query_field):es_connection = get_collention(dataset_index_name,vector_que…

Redis+Caffeine 太强了!二级缓存可以这样实现!

在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。 在一些场景下可能还需要进一步配合本地缓存使用&#xff0c;例如Guava cache或Caffeine&#xff0c;从而再次提升程序的响应…

Keil5 配置jlink及jlink下载程序,程序没有运行

1.先选好对应的芯片设备 之后步骤参考这个&#xff1a;MDK5 JLINK配置流程_keil5配置jlink仿真器步骤-CSDN博客 2.jlink下载程序之后板子没有运行可以查看reset and run是否有没有勾选

享元模式(Flyweight Pattern)

定义 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;其主要目的是通过共享尽可能多的数据来减少内存使用和提高性能。它通常在需要创建大量相似对象的情况下使用&#xff0c;以减少对象的数量和内存消耗。 示例 #include <iostream…

扫雷2(2537)

题目描述 扫雷游戏是一款十分经典的单机小游戏。它的精髓在于&#xff0c;通过已翻开格子所提示的周围格地雷数&#xff0c;来判断未翻开格子里是否是地雷。现在给出 m 行 n 列的雷区中的地雷分布&#xff0c;要求计算出每个非地雷格的周围格地雷数。 注&#xff1a;每个格子周…