몇 개의 덩어리로 구성된 초콜릿 바가 하나 있다고 가정합니다. 각 청크에는 단맛이라는 목록에 의해 주어진 고유한 단맛이 있습니다. K 친구와 초콜릿을 공유하려면 K 컷을 사용하여 초콜릿 바를 K+1 조각으로 자르기 시작합니다. 이제 각 조각은 연속적인 덩어리로 구성됩니다. 우리가 최소한의 총 단맛을 가진 조각을 꺼내고 다른 조각을 우리 친구들에게 준다면. 우리는 초콜릿 바를 최적으로 절단하여 얻을 수 있는 조각의 최대 총 단맛을 찾아야 합니다.
따라서 입력이 sweet =[1,2,3,4,5,6,7,8,9], K =5와 같으면 초콜릿을 [1,2로 나눌 수 있으므로 출력은 6이 됩니다. ,3], [4,5], [6], [7], [8], [9] 이 조각들.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ok() 함수를 정의하면 배열 v, cuts, maxVal,
가 필요합니다. -
카운터 :=0, 온도 :=0
-
initialize i :=0의 경우, i <=v의 크기일 때 업데이트(i를 1만큼 증가), 수행 -
-
temp> =maxVal이면
-
(카운터 1 증가)
-
온도 :=0
-
-
i가 v의 크기와 같으면 -
-
루프에서 나오세요
-
-
온도 :=온도 + v[i]
-
-
카운터>=컷
일 때 true를 반환합니다. -
기본 방법에서 다음을 수행합니다.
-
최대 :=-1
-
n :=s
의 크기 -
낮음 :=0, 높음 :=0
-
initialize i :=0의 경우, i
-
low :=low 및 s[i]
의 최소값 -
높음 :=높음 + s[i]
-
-
(최대 1 증가)
-
낮음 <높음, 수행 -
-
중간 :=낮음 + (높음 - 낮음 + 1) / 2
-
ok(s, k + 1, mid)가 참이면 -
-
낮음 :=중간
-
-
그렇지 않으면
-
높음 :=중간 - 1
-
-
-
낮은 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#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