C++巧克力分割


假设我们有一块巧克力,它由一些小块组成。每块小巧克力的甜度由名为sweetness的列表给出。如果我们要将巧克力分给K个朋友,我们使用K个切割将巧克力分成K+1块,现在每块都包含一些连续的小块。如果我们取出甜度总和最小的部分,并将其他部分送给我们的朋友,我们必须找到通过最佳切割巧克力可以获得的最大甜度总和。

因此,如果输入类似于 sweetness = [1,2,3,4,5,6,7,8,9],K = 5,则输出将为 6,因为您可以将巧克力分成 [1,2,3]、[4,5]、[6]、[7]、[8]、[9] 这些块。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数 ok(),它将接收一个数组 v、切割次数 cuts 和最大值 maxVal。

  • 计数器 counter := 0,临时变量 temp := 0

  • 对于初始化 i := 0,当 i <= v 的大小,更新 (i 增加 1),执行:

    • 如果 temp >= maxVal,则

      • (计数器增加 1)

      • temp := 0

    • 如果 i 等于 v 的大小,则:

      • 退出循环

    • temp := temp + v[i]

  • 如果计数器 counter >= cuts,则返回 true

  • 在主方法中执行以下操作

  • maxa := -1

  • n := s 的大小

  • low := 0,high := 0

  • 对于初始化 i := 0,当 i < n,更新 (i 增加 1),执行:

    • low := low 和 s[i] 的最小值

    • high := high + s[i]

  • (high 增加 1)

  • 当 low < high 时,执行:

    • mid := low + (high - low + 1) / 2

    • 如果 ok(s, k + 1, mid) 为真,则:

      • low := mid

    • 否则

      • high := mid - 1

  • 返回 low

让我们看看下面的实现来更好地理解:

示例

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool ok(vector <int> v, int cuts, int maxVal){
      int counter = 0;
      int temp = 0;
      for (int i = 0; i <= v.size(); i++) {
         if (temp >= maxVal) {
            counter++;
            temp = 0;
         }
         if (i == v.size()) {
            break;
         }
         temp += v[i];
      }
      return counter >= cuts;
   }
   int maximizeSweetness(vector<int>& s, int k) {
      int maxa = -1;
      int n = s.size();
      int low = 0;
      int high = 0;
      for (int i = 0; i < n; i++) {
         low = min(low, s[i]);
         high += s[i];
      }
      high++;
      while (low < high) {
         int mid = low + (high - low + 1) / 2;
         if (ok(s, k + 1, mid))
            low = mid;
         else
            high = mid - 1;
      }
      return low;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,7,8,9};
   cout << (ob.maximizeSweetness(v, 5));
}

输入

{1,2,3,4,5,6,7,8,9}, 5

输出

6

更新于:2020年7月11日

浏览量:319

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.