मान लीजिए कि हमारे पास संख्याओं की एक सूची है जिसे अंक कहा जाता है और दूसरा मान k है। हम सूची को k गैर-रिक्त उप-सूचियों में विभाजित कर सकते हैं। हमें k उप-सूचियों का न्यूनतम सबसे बड़ा योग ज्ञात करना है।
इसलिए, यदि इनपुट संख्या =[2, 4, 3, 5, 12] k =2 की तरह है, तो आउटपुट 14 होगा, क्योंकि हम सूची को विभाजित कर सकते हैं जैसे:[2, 4, 3, 5] और [ 12].
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक फ़ंक्शन को परिभाषित करें ठीक (), यह सरणी v, k, x,
लेगा -
सीएनटी:=0, योग:=0
-
v −
. में प्रत्येक तत्व i के लिए-
यदि योग + i> x, तो -
-
योग :=मैं
-
(cnt 1 से बढ़ाएँ)
-
-
अन्यथा
-
योग :=योग + मैं
-
-
-
जब cnt <=k, अन्यथा असत्य
-
मुख्य विधि से निम्न कार्य करें -
-
निम्न:=0, सेवानिवृत्त:=0, उच्च:=0
-
प्रत्येक तत्व के लिए मैं अंकों में
-
उच्च:=उच्च + मैं
-
रिट:=रिट + आई
-
निम्न :=अधिकतम निम्न और i
-
-
जबकि कम <=उच्च, करें −
-
मध्य:=निम्न + (उच्च-निम्न)/2
-
यदि ठीक है (अंक, के -1, मध्य) सत्य है, तो -
-
रिट:=मध्य
-
उच्च :=मध्य - 1
-
-
अन्यथा
-
कम :=मध्य + 1
-
-
-
वापसी रिट
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
#include <bits/stdc++.h>
using namespace std;
bool ok(vector <int>& v, int k, int x){
int cnt = 0;
int sum = 0;
for(int i : v){
if(sum + i > x){
sum = i;
cnt++;
}
else{
sum += i;
}
}
return cnt <= k;
}
int solve(vector<int>& nums, int k) {
int low = 0;
int ret = 0;
int high = 0;
for(int i : nums){
high += i;
ret += i;
low = max(low, i);
}
while(low <= high){
int mid = low + ( high - low) / 2;
if(ok(nums, k - 1, mid)){
ret = mid;
high = mid - 1;
}
else{
low = mid + 1;
}
}
return ret;
}
int main(){
vector<int> v = {2, 4, 3, 5, 12};
int k = 2;
cout << solve(v, k);
} इनपुट
{2, 4, 3, 5, 12}, 2 आउटपुट
14