百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

2025-08-24:吃披萨。用go语言,给出一个长度为 n 的整数数组 pizza

off999 2025-09-01 11:18 44 浏览 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 语言和算法助力您的职业发展

·

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: