日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力

發布時間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1231 Divide Chocolate 分享巧克力

問題描述

你有一大塊巧克力,它由一些甜度不完全相同的小塊組成。我們用數組 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

思路

讀題

將數組分成K+1份, 每份獨立且包含是一連續子序列

計算每份元素之和, 使得最小那份是在所有可能分割方案中最大

貪心

假設必定有一最佳答案ans, 它的情況是:

0 < ans <= sum(sweetness)/(K+1)

每個分塊之和必定 >= ans

以ans為界限分割的塊數量 >= (K+1)

先設ans=avg(sweetness, K+1), 期望最完美的情況下, 大家分到的一樣多, 最少的肯定也是所有方案中最多的

如果以此做界限切割不到K+1塊, 則縮減期望ans--

每次都假設當前期望ans是最佳切割方案的答案, 不斷-1逼近正確答案

貪心切割

每次累加之和大于等于閾值, 就認為這是最佳劃分, 作為1塊

最終判斷是否能切割到(K+1)塊

貪心+二分

最佳答案ans還有一個特性:

ans 是最佳答案

ans+1 不是答案

ans-1 是答案

即以ans為界限, 大于它的都無法做出預期切割方案, 小于等于它的都可以做出切割方案, 其中等于它就是最佳切割方案

這樣就有一個二分的特性

我們可以在一個確定有正確答案的范圍內, 使用二分搜索, 不斷調整范圍區間, 直至找到正確答案

其中判斷正確答案的位置時:

[left, right] mid = (left + right) >> 1

checkout(mid)

可以通過 left = mid+1 向右逼近最佳

不可以通過 right = mid-1 向左逼近最佳

checkout 就是之前的貪心切割

代碼實現

貪心

/**

* 超出時間限制 avg調整過慢

*/

class Solution {

public int maximizeSweetness(int[] sweetness, int K) {

// sum 該數組總和

int sum = 0;

for (int swt : sweetness) {

sum += swt;

}

// avg 如果平均分給K+1個人

int avg = sum / (K + 1);

while (avg > 0) {

// cur 當前分塊個數

// curSum 每個分塊的大小

int cur = 0, curSum = 0;

for (int swt : sweetness) {

curSum += swt;

System.out.printf("cut:%d K:%d curSum:%d avg:%d\n", cur, K, curSum, avg);

if (curSum >= avg) {

System.out.println();

// 從第0塊開始切 (cur++ > K or ++cur > (K+1))

if (cur++ >= K) {

return avg;

}

curSum = 0;

}

}

// 以步長為1的"速度"向最佳答案靠近

avg--;

}

return avg;

}

}

貪心+二分

class Solution {

public int maximizeSweetness(int[] sweetness, int K) {

// ans 返回答案

// left 二分左值

// right 二分右值 大小為1e4*1e5

int ans = 0, left = 0, right = (int) 1e9 + 50;

// 最佳甜度必定在[left, right]區間內

while (left <= right) {

int mid = (left + right) >> 1;

// 檢測: 以mid為界限, 大于它的都不可以, 小于等于則可以

if (check(sweetness, K + 1, mid)) {

// 最佳mid值在后半段 [mid+1, right]

left = mid + 1;

ans = Math.max(mid, ans);

} else {

// 最佳mid值在前半段 [left, mid-1]

right = mid - 1;

}

}

return ans;

}

private boolean check(int[] arr, int len, int threshold) {

// cur 在分塊總和滿足閾值threshold的情況下 可切塊數量 --> k+1

// sum 單分塊之和

int cur = 0, sum = 0;

for (int a : arr) {

sum += a;

// 該連續塊之和符合閾值 予以分塊

if (sum >= threshold) {

cur++;

sum = 0;

}

}

// 如果在閾值threshold下 可以分成k+1塊 該切割策略符合題意

return cur >= len;

}

}

改進: 縮小二分查找范圍

/**

* 同上相同的思路

* 不過使用二叉搜索的方式 并且進行了'剪枝'(最終結果必定不超過平均值, 縮小了二叉搜索范圍)

*/

class Solution {

public int maximizeSweetness(int[] sweetness, int K) {

int sum = 0;

for (int swt : sweetness) {

sum += swt;

}

// right 采用平均值

int left = 0, right = sum / (K + 1), ans = 0;

while (left <= right) {

int mid = (left + right) >> 1, cur = 0, curSum = 0;

System.out.printf("[left:%d mid:%d right:%d]\n", left, mid, right);

for (int swt : sweetness) {

curSum += swt;

System.out.printf("[cut:%d K:%d] [curSum:%d mid:%d]\n", cur, K, curSum, mid);

if (curSum >= mid) {

if (cur++ >= K) {

break;

}

curSum = 0;

}

}

if (cur > K) {

ans = Math.max(ans, mid);

left = mid + 1;

} else {

right = mid - 1;

}

}

return ans;

}

}

input:

[1,2,3,4,5,6,7,8,9]

5

output:

[left:0 mid:3 right:7]

[cut:0 K:5] [curSum:1 mid:3]

[cut:0 K:5] [curSum:3 mid:3]

[cut:1 K:5] [curSum:3 mid:3]

[cut:2 K:5] [curSum:4 mid:3]

[cut:3 K:5] [curSum:5 mid:3]

[cut:4 K:5] [curSum:6 mid:3]

[cut:5 K:5] [curSum:7 mid:3]

[left:4 mid:5 right:7]

[cut:0 K:5] [curSum:1 mid:5]

[cut:0 K:5] [curSum:3 mid:5]

[cut:0 K:5] [curSum:6 mid:5]

[cut:1 K:5] [curSum:4 mid:5]

[cut:1 K:5] [curSum:9 mid:5]

[cut:2 K:5] [curSum:6 mid:5]

[cut:3 K:5] [curSum:7 mid:5]

[cut:4 K:5] [curSum:8 mid:5]

[cut:5 K:5] [curSum:9 mid:5]

[left:6 mid:6 right:7]

[cut:0 K:5] [curSum:1 mid:6]

[cut:0 K:5] [curSum:3 mid:6]

[cut:0 K:5] [curSum:6 mid:6]

[cut:1 K:5] [curSum:4 mid:6]

[cut:1 K:5] [curSum:9 mid:6]

[cut:2 K:5] [curSum:6 mid:6]

[cut:3 K:5] [curSum:7 mid:6]

[cut:4 K:5] [curSum:8 mid:6]

[cut:5 K:5] [curSum:9 mid:6]

[left:7 mid:7 right:7]

[cut:0 K:5] [curSum:1 mid:7]

[cut:0 K:5] [curSum:3 mid:7]

[cut:0 K:5] [curSum:6 mid:7]

[cut:0 K:5] [curSum:10 mid:7]

[cut:1 K:5] [curSum:5 mid:7]

[cut:1 K:5] [curSum:11 mid:7]

[cut:2 K:5] [curSum:7 mid:7]

[cut:3 K:5] [curSum:8 mid:7]

[cut:4 K:5] [curSum:9 mid:7]

參考資源

總結

以上是生活随笔為你收集整理的java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人av免费在线 | 91精品啪在线观看国产 | 我要看免费的毛片 | 一区二区久久久 | 熟女人妻一区二区三区免费看 | 久操成人 | 亚洲中文字幕无码不卡电影 | 亚洲欧美成人一区二区 | 欧美一级一区二区 | 九九热精品在线视频 | 超碰九七 | 麻豆成人av | 成熟妇人a片免费看网站 | 成人免费网站黄 | 亚洲天堂黄色 | 日本丰满熟妇bbxbbxhd | 国产一级二级在线观看 | 精品黑人一区二区三区在线观看 | 国产黄色片子 | 亚洲天堂2013 | 深夜视频在线观看免费 | 国内精品视频 | 最新国产精品 | www.成人av| 国产成人亚洲精品无码h在线 | 一区二区三区美女 | 91麻豆国产精品 | 少妇户外露出[11p] | 亚洲无码精品一区二区三区 | 成人片片 | 中文字幕狠狠 | 日本人妻不卡一区二区三区中文字幕 | 久久久久久久久久久久久久久久久久 | 2018天天弄 | 99久久国产视频 | 超碰免费在线 | 天堂网a| 国产在线视频你懂得 | 黄色三级av | 国产日韩一区二区在线 | 国产一线二线在线观看 | 国产尤物在线 | 久久精品久久精品久久 | 午夜时刻免费入口 | 黑人玩弄人妻一区二区三区 | 日韩免费视频一区二区视频在线观看 | av激情网站 | 午夜免费体验区 | 91成人短视频| 亚洲一区二区自偷自拍 | 亚洲美女中文字幕 | 99热这里只有精品1 亚洲人交配视频 | 日韩三级网| 国产一区二区三区免费在线观看 | 成人av影视在线观看 | xxxwww黄色| 亚洲欧洲一区 | sese欧美 | 亚洲av电影天堂男人的天堂 | 日本一二三不卡视频 | 精品人妻无码一区二区三区 | 午夜影院视频 | 少妇系列在线观看 | 青草青草视频 | 亚欧洲精品 | 欧美性做爰免费观看 | 一区二区伦理片 | 日韩精品偷拍 | 久久99精品久久久久久琪琪 | 高清无码一区二区在线观看吞精 | 日本一区二区不卡在线观看 | 可以免费看的黄色 | 波多野结衣99 | 日韩一区二区不卡 | 特级毛片av | 亚洲无码精品免费 | 亚洲专区中文字幕 | 香蕉视频久久久 | 人人做人人爽人人爱 | 五月婷婷天 | 精品久久无码视频 | 女性裸体视频网站 | 日本亚洲最大的色成网站www | 天堂视频在线观看免费 | 美女毛片网站 | 欧美88av | 在线成人小视频 | 噜噜在线视频 | 香蕉久久一区二区三区 | 在线不卡国产 | 日本欧美一级片 | 欧美成人精品一区二区 | 精品一区二区久久久 | 91欧美精品 | 成人精品一区二区三区视频 | 哪里可以看毛片 | 五月婷婷丁香花 | 欧美高清二区 | 欧美做受喷浆在线观看 |