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

2024-02-26 23:20
文章标签 统一 华为 考试 od 披萨

本文主要是介绍分披萨 - 华为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加群”

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

这篇关于分披萨 - 华为OD统一考试(C卷)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750484

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和