2025-08-24:吃披萨。用go语言,给出一个长度为 n 的整数数组 pizza
off999 2025-09-01 11:18 26 浏览 0 评论
2025-08-24:吃披萨。用go语言,给出一个长度为 n 的整数数组 pizzas,pizzas[i] 表示第 i 个披萨的重量。每一天必须恰好取出 4 个披萨来食用,并把这 4 个披萨按重量从小到大排成 a ≤ b ≤ c ≤ d:
o 若是第 1、3、5… 天(奇数天),当天的体重增加值为 d(这四个中最重的那块)。
o 若是第 2、4、6… 天(偶数天),当天的体重增加值为 c(这四个中第二重的)。
要求将所有披萨分成 n/4 组四个为一组(每个披萨只能用一次),并确定各组的食用顺序,使得累计的体重增加值最大化。已知 n 为 4 的倍数。求这个最大可能的总增加量。
4 <= n == pizzas.length <= 2 * 100000。
1 <= pizzas[i] <= 100000。
n 是 4 的倍数。
输入: pizzas = [1,2,3,4,5,6,7,8]。
输出: 14。
解释:
第 1 天,你吃掉下标为 [1, 2, 4, 7] = [2, 3, 5, 8] 的披萨。你增加的重量为 8。
第 2 天,你吃掉下标为 [0, 3, 5, 6] = [1, 4, 6, 7] 的披萨。你增加的重量为 6。
吃掉所有披萨后,你增加的总重量为 8 + 6 = 14。
题目来自力扣3457。
解决思路
1. 排序披萨:首先将披萨按重量从大到小排序。这样我们可以优先考虑重量大的披萨,因为它们可能贡献更多的增加值。
2. 分组策略:总共有 days = n/4 天(即组数)。为了最大化总增加量,我们需要让奇数天分配到尽可能大的最大值(d),偶数天分配到尽可能大的次大值(c)。
3. 奇数天和偶数天的分配:
o 奇数天(第1、3、5…天)直接取最大的那些值作为d(即每组最大值)。因为奇数天直接取最大值,所以我们可以直接取排序后最大的前 odd = (days+1)/2 个披萨(这些将作为奇数天的最大值)。
o 偶数天(第2、4、6…天)需要取次大值(c)。但次大值不能直接取最大的那些(因为最大值已经被奇数天占用了),而是需要从剩余的披萨中挑选较大的次大值。
4. 具体分配方法:
o 排序后,最大的前 odd 个披萨(即排序后的前 odd 个)被分配给奇数天作为最大值(d)。
o 对于偶数天,我们需要为每组分配一个次大值(c)。这些次大值应该尽可能大,但必须避免与奇数天冲突(即不能重复使用披萨)。
o 实际上,我们可以通过间隔选取的方式:从排序后的数组中,在跳过前 odd 个之后,每隔一个取一个披萨(即取索引为 odd+1, odd+3, odd+5... 的披萨),共取 days/2 个。这些被选取的披萨将作为偶数天的次大值(c)。
5. 为什么这样分配?:
o 奇数天直接取最大的前 odd 个披萨,这显然是最优的(因为奇数天直接取最大值,所以最大的几个必须分配给奇数天)。
o 对于偶数天,我们需要次大值(c)尽可能大。但每组由4个披萨组成,最大值(d)已经很大(通常比c大),所以c不能太大(否则会浪费成为d的机会)。实际上,我们希望c尽可能大,但又不能占用那些可能成为更大d的披萨(即前odd个)。
o 排序后,数组从大到小排列。前odd个已经被用作奇数天的d。接下来,我们考虑剩余披萨中较大的那些作为偶数天的c。但如果我们直接取剩余最大的(即索引odd处的披萨),那么它可能应该作为某个组的d(但奇数天已经用完d名额),所以它只能作为c?但注意:实际上,每个组需要4个披萨,而且d和c来自同一组。
o 更深入的解释:为了最大化总增加量,我们应该让奇数天的d尽可能大(所以取前odd个最大的),然后让偶数天的c尽可能大(但不能影响奇数天的d)。实际上,偶数天的c应该从排序后的数组中“间隔”选取:因为如果我们取索引odd(即第odd+1大的披萨)作为某个偶数天的c,那么它所在的组必须有一个比它更大的d(但这个d已经被奇数天占用了,所以这个组不能是偶数天?)。实际上,我们需要为偶数天构造组,使得c尽可能大,同时d更大(但d已经被奇数天占用了,所以偶数天的d必须比c大,但可能小于奇数天的d)。
o 实际上,算法中偶数天取的c是排序后数组中的索引为 odd+1, odd+3, odd+5... 的元素。这样做的原因是:这些位置的值足够大(因为数组已排序),而且通过间隔选取,可以确保每个偶数天组有一个更大的d(这个d来自前odd个中的某个,但前odd个已经分配给奇数天了?)——这里需要更仔细的构造。
o 实际上,分组是隐含的:我们并不显式构造每组4个披萨,而是直接计算总和。因为问题只要求总和最大化,并不需要输出分组方案。所以算法直接选取了贡献值(奇数天的d和偶数天的c)并求和。
详细步骤(以输入[1,2,3,4,5,6,7,8]为例)
1. 排序披萨:从大到小排序后得到 [8,7,6,5,4,3,2,1]。
2. 计算天数:days = 8/4 = 2。
o 奇数天个数:odd = (2+1)/2 = 1(即第1天是奇数天)。
o 偶数天个数:days/2 = 1(即第2天是偶数天)。
3. 选取奇数天的d:取前odd=1个最大的披萨,即8。
4. 选取偶数天的c:从索引odd=1开始(即跳过前1个),每隔一个取一个,共取days/2=1个:
o 起始索引:odd=1(即第2个元素,值为7)。
o 但算法中取的是 odd + i*2 + 1?实际上,代码中循环是 for i in range(days/2),取索引为 odd + i*2 + 1。
o 对于i=0:索引 = 1 + 0*2 + 1 = 2(即第3个元素,值为6)。
o 所以取的是6(而不是7)。
5. 总增加量 = 8 + 6 = 14。
为什么取索引2(值为6)而不是索引1(值为7)?
o 因为如果取索引1(7)作为偶数天的c,那么它所在的组需要有一个比7更大的d(至少为8)。但最大的d(8)已经被奇数天占用了,所以这个组不能是偶数天?实际上,我们需要避免冲突。
o 更一般地,这种间隔选取方式确保了每个偶数天的c对应的组有一个更大的d(这个d来自前odd个),并且不会重复使用披萨。
总结
o 算法通过排序和贪心策略,直接选取贡献值(奇数天的最大值和偶数天的次大值)求和,得到最大总增加量。
o 时间复杂度:排序时间复杂度为 O(n log n),后续的遍历为 O(n),因此总时间复杂度为 O(n log n)。
o 空间复杂度:排序可能使用 O(log n) 的额外空间(如快速排序的递归栈),因此总额外空间复杂度为 O(log n)。
注意
该算法不需要显式构造分组方案,而是通过数学推导直接计算最优和。这种方法的正确性基于贪心选择:让奇数天分配最大的那些值作为d,偶数天分配尽可能大(但又不与奇数天冲突)的值作为c。间隔选取(跳过一些值)是为了确保分组可行(即每个组有4个披萨且不重复使用)。
Go完整代码如下:
package main
import (
"fmt"
"slices"
)
func maxWeight(pizzas []int) (ans int64) {
slices.SortFunc(pizzas, func(a, b int)int { return b - a })
days := len(pizzas) / 4
odd := (days + 1) / 2
for _, x := range pizzas[:odd] {
ans += int64(x)
}
for i := range days / 2 {
ans += int64(pizzas[odd+i*2+1])
}
return
}
func main() {
pizzas := []int{1,2,3,4,5,6,7,8}
result := maxWeight(pizzas)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def max_weight(pizzas):
pizzas.sort(reverse=True)
days = len(pizzas) // 4
odd = (days + 1) // 2
ans = sum(pizzas[:odd])
for i in range(days // 2):
ans += pizzas[odd + i * 2 + 1]
return ans
if __name__ == "__main__":
pizzas = [1, 2, 3, 4, 5, 6, 7, 8]
result = max_weight(pizzas)
print(result)
·
我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。
欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展
·
相关推荐
- 电脑自由截屏的快捷键是什么
-
快捷键是ctrl+alt+a,我们可将聊天窗口缩小,放在旁边。然后找到想要截屏的位置,这时我们在截屏旁边,就更加的方便了。在键盘中按下PrintScreenSysRq(简写为PrtSc)键,此快捷...
- windows10精简版官网下载(win10官方精简版下载)
-
精简版的意思的它比原版的功能和软件少了,其实精简版的更适合大众,没有多余的其他必要功能,更快Win10版本主要为四个分别是专业版、家庭版、企业版、教育版,其实除了这四个之外,还有工作站版、LTSB/L...
- cad2008安装失败(Win11安装cad2008安装失败)
-
解决方法:1、右键点击“开始”按钮,选择“程序和功能”;2、然后点击“启用或关闭windows功能”;3、勾选“Microsoft.NETFramework3.5(包括.Net2.0)”后点击确定按钮...
- u盘在电脑上怎么找出来(u盘在电脑上怎么找到)
-
在电脑中找不到u盘,是因为系统没有自动识别出来,手动打开即可,具体的解决步骤如下:1、在桌面上点击我的电脑,右键,管理。2、打开管理界面,点击储存。3、进到储存页面。4、到这一步,也就可以看到了,有这...
- 联想一体机怎么进入bios(联想一体机怎么进入u盘启动)
-
所需工具:联想Lenovo品牌一体机、启动U盘。具体步骤如下:1、联想一体机从U盘启动设置步骤如下重启联想一体机,启动过程中按F1进入BIOS,部分机型则是开机按Enter键,进入之后再按F12选择进...
- 如何装ghost系统盘(ghost装机教程)
-
ghost是不能做系统c盘,它是一种对硬盘和分区制作成映像文件进行备份和恢复的工具软件,是不能进行操作系统安装。这个软件的使用目的是,当我们安装配置好操作系统以后,用ghost软件对c盘进行备份,或者...
- 加密u盘如何格式化(加密u盘如何格式化手机)
-
1,点击系统与安全进入电脑的控制面板界面,点击上方的系统与安全的选项,在系统界面找到最下方的管理工具功能组。2,选中u盘选择管理工具下面的创建并格式化硬盘分区,点击弹出磁盘管理的界面,在这个里面选中你...
- 万能显卡驱动离线版pc(万能显卡驱动离线版)
-
万用驱动是综合各电脑硬件的性能而制做的软件,对于大多数的电脑硬件驱动都好用,但对于少数品牌电脑驱动要求严格的,就不灵了。有的硬件用万能驱动后,使用效果不佳,就是因为没有完全驱动好。所以,知名品牌电脑硬...
- 笔记本windows8系统下载(笔记本电脑系统win8)
-
在电脑上面就可以下载,打开浏览器搜索windous8系统会出现一些下拉选择,选择第一条或者选择有官网字样的,就直接有下载按钮,然后点击下载就可以了win8可以支持现在可以见到的所有Photosho...
- win 11(win 11 25h2)
-
Windows11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备。于2021年6月24日发布,2021年10月5日发行。Windows11提供了许多创新...
- 手机视频恢复软件免费版下载
-
手机视频删了怎么恢复 一、安卓手机视频恢复 1.打开电脑,移动鼠标,进入互盾安卓恢复大师官网,下载并安装该软件。手机连接至电脑。手机视频删了怎么恢复 2.打开运行互盾安卓恢复大师,在软件界面看到...
- diy电脑装机教程(diy电脑组装步骤)
-
1,看价格。根据自己的预算价格,选择适合该价格的电脑。注意不要以过高的价格买到配置过低的电脑;2,看性能。根据自己需要的电脑性能,以合理的价格购买。注意不要以过高的价格买到配置过低的电脑。电脑的配置如...
- u盘莫名其妙要格式化(u盘总是要格式化什么意思)
-
如果您在使用U盘时突然收到提示需要格式化的消息,这可能是由于以下原因之一引起的:U盘感染病毒:U盘中可能存在恶意病毒,这些病毒可能会导致U盘无法正常使用。当您尝试打开U盘时,系统会提示您进行格式化操作...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
