মূল কনটেন্টে যান
🧩
লোকাল DSA
প্যাটার্নটপিক 2 · Binary Search

2.3 Allocation Problems

চিনবেন কীভাবে
"distribute/allocate/divide K জনে", "minimize the largest share" — binary search on answer-এরই বিশেষ রূপ, feasible() = "এই cap-এ K ভাগে ভাগ করা যায় কি?"
Demo · approach · কোড — আগে নিজে চেষ্টা, আটকালে খুলুন

Demo: Split Array Largest SumLC 410 (Hard — Google High)

Statement (Demo): non-negative integer array nums এবং একটি integer k দেওয়া আছে। array-টিকে kটি contiguous non-empty subarray-তে ভাগ করতে হবে যাতে এই subarray গুলোর সর্বোচ্চ যোগফল ন্যূনতম (minimize the largest sum among these k subarrays) হয়। উদাহরণ: nums = [7,2,5,10,8], k = 2 → 18 | ⚡ n ≤ 1000, 1 ≤ k ≤ min(50, n), 0 ≤ nums[i] ≤ 10⁶

Approach: উত্তরের range: max(nums) (এক এলিমেন্টের ভাগ) থেকে sum(nums) (সব এক ভাগে)। প্রতিটা cap-এর জন্য greedy করে দেখুন কত ভাগ লাগে — k ভাগের মধ্যে হলে cap কমান।

function splitArray(nums, k) {
  const canSplit = (cap) => {
    let parts = 1,
      sum = 0;
    for (const x of nums) {
      if (sum + x > cap) {
        parts++;
        sum = 0;
      }
      sum += x;
    }
    return parts <= k;
  };
  let lo = Math.max(...nums),
    hi = nums.reduce((a, b) => a + b, 0);
  while (lo < hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (canSplit(mid)) hi = mid;
    else lo = mid + 1;
  }
  return lo;
}

Complexity: Time O(n log sum), Space O(1)

প্রবলেম

  • Allocate Minimum Number of PagesGfG
    (LC 410-এর যমজ)

    Statement: nটি বইয়ের পাতার সংখ্যা arr[i] দেওয়া আছে এবং k জন শিক্ষার্থী আছে। বইগুলো এমনভাবে শিক্ষার্থীদের মধ্যে ভাগ করে দিতে হবে যাতে প্রতিটি বই ঠিক একজন শিক্ষার্থী পায়, বইগুলো ক্রমান্বয়ে (contiguous) বণ্টিত হয় এবং একজন শিক্ষার্থীর ভাগে পড়া সর্বোচ্চ পাতার সংখ্যা যেন ন্যূনতম (minimize the maximum pages allocated to a student) হয়। যদি বণ্টন অসম্ভব হয়, তবে -1 রিটার্ন করুন।
    উদাহরণ: arr = [12,34,67,90], k = 2 → 113 | ⚡ n ≤ 10⁵, 1 ≤ k ≤ n, 1 ≤ arr[i] ≤ 10⁶

    নোট · ফাঁকা