【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 披萨大作战(100分) - 三语言AC题解(Python/Java/Cpp)

本文主要是介绍【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 披萨大作战(100分) - 三语言AC题解(Python/Java/Cpp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1067

🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • 🥧 披萨大作战
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码

🥧 披萨大作战

题目描述

K小姐和A先生到披萨店点了一份圆形披萨,并嘱咐店员将披萨切成大小相同的偶数块。但是粗心的服务员把披萨切成了大小不一的 N N N 块,且 N N N 为奇数。

为了公平起见,两人商量了一个取披萨的规则:从K小姐开始,轮流取披萨。除了第一块披萨可以随意选取外,其余的披萨必须从上一个人取完的披萨的相邻位置开始取。

A先生每次都会选择剩下披萨中最大的一块,而K小姐知道A先生的这个特点。现在给定每块披萨的大小,请问K小姐最多能够取到多少大小的披萨呢?

输入格式

第一行包含一个正整数 N N N,表示披萨被切成了 N N N 块。

接下来 N N N 行,每行一个正整数,第 i i i 行的整数表示第 i i i 块披萨的大小 A i A_i Ai

输出格式

输出一个整数,表示K小姐最多能够取到的披萨大小之和。

样例输入

5
8
2
10
5
7

样例输出

19

数据范围

  • 3 ≤ N < 500 3 \le N < 500 3N<500,保证 N N N 为奇数
  • 1 ≤ A i ≤ 2147483647 1 \le A_i \le 2147483647 1Ai2147483647

题解

本题可以使用记忆化搜索来解决。

定义 s o l v e ( L , R ) solve(L,R) solve(L,R) 表示当前还剩下第 L L L 块到第 R R R 块披萨时,K小姐能够取到的最大披萨大小之和。那么答案就是 m a x ( s o l v e ( ( i + 1 ) m o d N , ( i − 1 + N ) m o d N ) + A i ) max(solve((i+1) \bmod N, (i-1+N) \bmod N) + A_i) max(solve((i+1)modN,(i1+N)modN)+Ai),其中 0 ≤ i < N 0 \le i < N 0i<N

对于函数 s o l v e ( L , R ) solve(L,R) solve(L,R),我们可以分情况讨论:

  1. 如果 L = R L = R L=R,那么只剩下一块披萨,K小姐直接取走,因此 s o l v e ( L , R ) = A L solve(L,R) = A_L solve(L,R)=AL

  2. 如果 L ≠ R L \neq R L=R,那么A先生会取走两端披萨中较大的一块。设 L ′ L' L R ′ R' R 分别表示取走披萨后的左右端点,那么有:

    • 如果 A L > A R A_L > A_R AL>AR,那么 L ′ = ( L + 1 ) m o d N , R ′ = R L' = (L+1) \bmod N, R' = R L=(L+1)modN,R=R
    • 如果 A L ≤ A R A_L \le A_R ALAR,那么 L ′ = L , R ′ = ( R − 1 + N ) m o d N L' = L, R' = (R-1+N) \bmod N L=L,R=(R1+N)modN

    因此 s o l v e ( L , R ) = m a x ( A L + s o l v e ( L ′ , R ) , A R + s o l v e ( L , R ′ ) ) solve(L,R) = max(A_L + solve(L', R), A_R + solve(L, R')) solve(L,R)=max(AL+solve(L,R),AR+solve(L,R))

为了避免重复计算,我们可以使用记忆化数组 d p dp dp 来保存已经计算过的状态。其中 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示当前还剩下第 i i i 块到第 j j j 块披萨时,K小姐能够取到的最大披萨大小之和。

时间复杂度 O ( N 2 ) O(N^2) O(N2),空间复杂度 O ( N 2 ) O(N^2) O(N2)

参考代码

  • Python
N = int(input())
A = [int(input()) for _ in range(N)]
dp = [[-1] * N for _ in range(N)]def solve(L, R):if A[L] > A[R]:L = (L + 1) % Nelse:R = (R - 1 + N) % Nif dp[L][R] != -1:return dp[L][R]if L == R:dp[L][R] = A[L]else:dp[L][R] = max(A[L] + solve((L+1)%N, R), A[R] + solve(L, (R-1+N)%N))return dp[L][R]ans = 0
for i in range(N):ans = max(ans, solve((i+1)%N, (i-1+N)%N) + A[i])print(ans)
  • Java
import java.util.Scanner;public class Main {static int N;static int[] A;static int[][] dp;public static void main(String[] args) {Scanner sc = new Scanner(System.in);N = sc.nextInt();A = new int[N];for (int i = 0; i < N; i++) {A[i] = sc.nextInt();}dp = new int[N][N];for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {dp[i][j] = -1;}}int ans = 0;for (int i = 0; i < N; i++) {ans = Math.max(ans, solve((i+1)%N, (i-1+N)%N) + A[i]);}System.out.println(ans);}static int solve(int L, int R) {if (A[L] > A[R]) {L = (L + 1) % N;} else {R = (R - 1 + N) % N;}if (dp[L][R] != -1) {return dp[L][R];}if (L == R) {dp[L][R] = A[L];} else {dp[L][R] = Math.max(A[L] + solve((L+1)%N, R), A[R] + solve(L, (R-1+N)%N));}return dp[L][R];}
}
  • Cpp
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 500;
int n, a[N], dp[N][N];int solve(int L, int R) {if (a[L] > a[R]) {L = (L + 1) % n;} else {R = (R - 1 + n) % n;}if (dp[L][R] != -1) {return dp[L][R];}if (L == R) {dp[L][R] = a[L];} else {dp[L][R] = max(a[L] + solve((L+1)%n, R), a[R] + solve(L, (R-1+n)%n));}return dp[L][R];
}int main() {cin >> n;for (int i = 0; i < n; i++) {cin >> a[i];}memset(dp, -1, sizeof(dp));int ans = 0;for (int i = 0; i < n; i++) {ans = max(ans, solve((i+1)%n, (i-1+n)%n) + a[i]);}cout << ans << endl;return 0;
}

这篇关于【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 披萨大作战(100分) - 三语言AC题解(Python/Java/Cpp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超