5111. 分享巧克力

你有一大块巧克力,它由一些甜度不完全相同的小块组成。我们用数组 sweetness 来表示每一小块的甜度。

你打算和 K 名朋友一起分享这块巧克力,所以你需要将切割 K 次才能得到 K+1 块,每一块都由一些 连续 的小块组成。

为了表现出你的慷慨,你将会吃掉 总甜度最小 的一块,并将其余几块分给你的朋友们。

请找出一个最佳的切割策略,使得你所分得的巧克力 总甜度最大,并返回这个 最大总甜度。

 

示例 1:

输入:sweetness = [1,2,3,4,5,6,7,8,9], K = 5
输出:6
解释:你可以把巧克力分成 [1,2,3], [4,5], [6], [7], [8], [9]。
示例 2:

输入:sweetness = [5,6,7,8,9,1,2,3,4], K = 8
输出:1
解释:只有一种办法可以把巧克力分成 9 块。
示例 3:

输入:sweetness = [1,2,2,1,2,2,1,2,2], K = 2
输出:5
解释:你可以把巧克力分成 [1,2,2], [1,2,2], [1,2,2]。
 

提示:

0 <= K < sweetness.length <= 10^4
1 <= sweetness[i] <= 10^5

 

class Solution:
    def maximizeSweetness(self, sweetness: List[int], K: int) -> int:
        def f(x):
            k, s = K, 0
            for i in sweetness:
                s += i
                if s >= x:
                    s, k = 0, k - 1
            return k < 0
        i, j = 1, sum(sweetness) // (K + 1) + 1
        while i < j - 1:
            k = (i + j) // 2
            if f(k):
                i = k
            else:
                j = k
        return i

 

### C++ 实现分巧克力算法 为了实现分巧克力问题,采用二分查找的方法来优化解题效率。给定一块尺寸为 \(m \times n\) 的矩形巧克力板,目标是将其切割成尽可能大的正方形巧克力片,使得这些正方形的边长不超过某个特定的最大值。 #### 代码示例 下面展示了如何利用C++编写程序解决此问题: ```cpp #include <iostream> using namespace std; bool canCut(int m, int n, long long size, int k) { return (m / size) * (n / size) >= k; } long long maxChocolateSize(int length, int width, int children) { long long low = 1; long long high = min(length, width); while (low <= high) { long long mid = low + (high - low) / 2; if (canCut(length, width, mid, children)) { if (!canCut(length, width, mid + 1, children)) return mid; else low = mid + 1; } else { high = mid - 1; } } return high; // 返回最大可能的边长 } ``` 这段代码定义了`maxChocolateSize`函数用于找到能够满足至少切出K块巧克力的最大单个正方形大小[^2]。通过调整变量名和逻辑表达式,使其实现更贴近实际应用场景中的需求描述。 对于每一个中间值`mid`,调用辅助判断函数`canCut()`验证当前假设下的方案是否可行。该函数接收四个参数——矩形两维长度以及尝试分配给孩子们的数量k;返回布尔类型的结论指示能否成功分割出足够的份额。 当确定了一个有效的候选答案后,继续探索更大的可能性直到无法再增加为止。最终输出的结果即为所求的最佳解。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值