通过率 37% · 提交 491 · 通过 184
小慕和朋友去披萨店点了一份圆形铁盘披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块。但粗心的店员却切成了每块大小都完全不同的奇数块,而且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个自认为公平的分法:从小慕开始,。 除了第一块披萨可以任意选取以外,其他都必须从处开始选。两人的选取思路不同。 朋友每次都会选最大块的披萨,而且小慕知道朋友的想法。 已知披萨小块的数量以及每块的大小,求小慕能分得的最大的披萨大小的总和。
这类题属于华为 OD 机考真题方向中「100分 / 2024E」方向的高频题型,通常考察对「100分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第1行为一个正整数奇数N,表示披萨小块数量。3 <= N <= 500。
接下来的第2行到第N+1行(共N行),每行为一个正整数,表示第ì块披萨的大小。1 <= i <= N。
披萨小块从某一块开始,按照一个方向依次顺序编号为1~N。每块披萨的大小范围为[1,21474836471]。
“吃货”能分得的最大的披萨大小的总和。
示例 1
输入示例
5 8 2 10 5 7
输出示例
19
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
Q:这题所提供的数组要求是环形的,怎么处理? A:将数组复制一次,拼接在原数组后面。因此,到时候取 a[0...n-1]、a[1...n]、a[2...n+1]、…… 中的最优一个解即可。
dp 数组是一个长度为 (n+n) * (n+n) 的二维列表,f[i][j] 表示吃货将 a[i...j] 中所有的披萨吃完后,吃货得到的最多披萨量。需要保证披萨的数量是奇数块,即 (j-i+1) % 2 = 1。
需要求解 f[i][j]。吃货有两种选择:
a[i+1...j]):a[i+1] > a[j],只剩下 a[i+2...j],对应 f[i+2][j],则 f[i][j] = f[i+2][j] + a[i];a[i+1] < a[j],只剩下 a[i+1...j-1],对应 f[i+1][j-1],则 f[i][j] = f[i+1][j-1] + a[i]。a[i...j-1]):a[i] > a[j-1],只剩下 a[i+1...j-1],对应 f[i+1][j-1],则 f[i][j] = f[i+1][j-1] + a[j];a[i] < a[j-1],只剩下 a[i...j-2],对应 f[i][j-2],则 f[i][j] = f[i][j-2] + a[j]。对应的代码实现如下:
一开始,如果只有一块披萨 a[i...i] 的话,吃货吃下 a[i],因此有 f[i][i] = a[i]。
初始化代码如下:
最终求解出 f 数组,由于我们给定的是环形披萨,因此全局的最大值为 max(f[0][n-1], f[1][n], ..., f[n-1][n+n-2])。
复杂度分析 设 n 为披萨的块数。为了处理环形结构,代码把数组复制一倍拼接,实际参与计算的规模是 2n。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。