কম্পিউটার টিউটোরিয়াল

সি++-এ kটি সাবলিস্টে ভাগ করে সর্বনিম্ন সর্বাধিক যোগফল খুঁজে বের করার প্রোগ্রাম


সমস্যা বিবরণ

একটি সংখ্যার তালিকা nums এবং একটি মান k দেওয়া আছে। লিস্টটিকে kটি খালি নন সাবলিস্টে ভাগ করতে হবে। লক্ষ্য হলো এই kটি সাবলিস্টের মধ্যে সর্বাধিক যোগফল যেন ন্যূনতম হয়।

উদাহরণ: nums = [2, 4, 3, 5, 12], k = 2 হলে আউটপুট 14। কারণ [2, 4, 3, 5] (যোগফল ১৪) এবং [12] (যোগফল ১২) — সর্বাধিক যোগফল ১৪।

সমাধানের পদ্ধতি

বাইনারি সার্চ এবং গ্রিডি পদ্ধতি ব্যবহার করা হয়:

  1. ok(v, k, x) ফাংশন: চেক করে যে কি x ম্যাক্সিমাম সাবলিস্ট সাম umož্য করে kটি সাবলিস্টে ভাগ করা যায়।
  2. low = max(nums), high = sum(nums) সেট করুন।
  3. বাইনারি সার্চ চালান: mid = (low + high) / 2।
  4. যদি ok(nums, k-1, mid) সত্য হয়, তবে high = mid - 1, অন্যথায় low = mid + 1।
  5. সর্বনিম্ন সম্ভাব্য mid রিটার্ন করুন।

উদাহরণ কোড

#include <bits/stdc++.h>
using namespace std;

bool ok(vector<int>& v, int k, int x) {
    int cnt = 0, 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, ret = 0, 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);
    return 0;
}

ইনপুট ও আউটপুট

ইনপুট: {2, 4, 3, 5, 12}, 2

আউটপুট: 14

  1. C++-এ n-এর সব dzielন করলে সর্বোচ্চ ডিজিট সম কোনটি?

  2. C++-এ বাইনারি ট্রির সর্ববৃহৎ সাবট্রি সম বের করুন

  3. সি++-এ kটি নন-ওভারল্যাপিং সাবলিস্টের সর্বোচ্চ যোগফল বের করা

  4. C++-এ বাইনারি ট্রি-র ন্যূনতম সম আয়ত্ত লেভেল বের করার প্রোগ্রাম