分披萨 - 华为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.hqwc.cn/news/493228.html

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

相关文章

Qt RGB三色灯上位机

今天突发奇想做一个Qt RGB三色灯上位机&#xff0c;刚好手上有一个RGB三色灯和arduion开发板。 我是想实现一个颜色选择器界面然后鼠标点击颜色区域就可以发出rgb的值&#xff0c;然后把这个值通过串口线发送给arduion,arduion再解析出数据发送给RGB三色灯。 实现界面如下&…

免编程经验,搭建宠物店小程序轻松实现

在如今的互联网时代&#xff0c;小程序商城已成为各行业推广和销售的热门方式。对于花店来说&#xff0c;搭建一个自己的小程序商城不仅可以提升品牌形象&#xff0c;还可以方便顾客在线选购花卉产品。下面就来教大家如何轻松搭建一个花店小程序商城&#xff0c;并通过引流获得…

计网自顶向下:网络应用层【Web应用与HTTP协议】

目录 Web应用Web页URLWorld Wide Web 超文本传输协议——HTTP超文本C/S结构报文请求报文响应报文HTTP响应状态码try&#xff1a;在命令行里手工给web服务器发送请求 http连接的两种类型非持久&#xff08;http1.0&#xff09;持久&#xff08;http1.1&#xff09;▷ 流水线▷ 非…

基于yolov2深度学习网络的火焰烟雾检测系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .................................................................. load yolov2.mat% 加载…

如何本地部署LightPicture结合cpolar内网穿透打造个人云图床

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

记生产OOM的故障分析

一、引言 生产上告警&#xff0c;交易堵塞&#xff0c;服务无响应&#xff0c;使用jstack、jmap、jhat命令进行故障分析。 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;作为Java语言的核心组件&#xff0c;为Java程序提供了运行环境和内存管理…

01背包问题:组合问题

01背包问题&#xff1a;组合问题 题目 思路 将nums数组分成left和right两组&#xff0c;分别表示相加和相减的两部分&#xff0c;则&#xff1a; left - right targetleft right sum 进而得到left为确定数如下&#xff0c;且left必须为整数&#xff0c;小数表示组合不存在&…

供应链大数据:穿越经济迷雾的指南针

随着经济形势的变幻莫测&#xff0c;企业运营面临着前所未有的挑战。在这个充满不确定性的时代&#xff0c;供应链大数据如同一盏明亮的指南针&#xff0c;为企业提供精准的方向指引。下面&#xff0c;我们将深入探讨供应链大数据如何帮助企业洞察市场趋势、优化库存管理、降低…

绝对路径拼接漏洞 [NISACTF 2022]babyupload

打开题目 最开始以为是文件上传的漏洞 结果发现无论我们上传什么文件都会显示bad filename 去网上看了大佬的wp知道 我们直接去看源代码得到提示 /source 那我们去访问一下这个路径看看 得到一个下载文件 用记事本打开得到 源代码如下 from flask import Flask, request, r…

支付流程的理解

开发指引-JSAPI支付 | 微信支付商户平台文档中心 业务流程图&#xff1a; 首先&#xff0c;从业务流程&#xff0c;当有人问你的时候&#xff0c;反问&#xff1a;公司有没有确认跟支付宝合作还是跟微信合作&#xff0c;看有没有签订协议&#xff0c;有的话&#xff0c;要确认…

数学建模【遗传算法】

一、遗传算法简介 从做菜说起&#xff0c;小魏是一名大厨&#xff0c;想要创造一道美味的菜肴。首先随机生成多个原始配方&#xff0c;每种配方所用的原料&#xff08;鸭脖、鸡肉、大肠等&#xff09;与手法&#xff08;煎炒焖炸卤炖&#xff09;组合不同&#xff0c;现实中考…

pytest教程-12-fixture作用域

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest fixture的基本使用方法&#xff0c;本小节我们讲解一下fixture的作用域。 fixture前后置区分 控制fixture的前置和后置操作是通过yield关键字进行来区分的&#xff0c;代码在yield前面…