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

C++-এ k সেট বিটস সহ একটি নম্বরকে ম্যাক্সিমাইজ করতে ন্যূনতম ফ্লিপ বের করা

সমস্যা বিবরণ

দুটি সংখ্যা n এবং k দেওয়া আছে। আমাদের ন্যূনতম কতগুলো বিট ফ্লিপ করলে দিয়ে गये নম্বরটি k সেট বিটস সহ সর্বোচ্চ হয়ে যাবে তা বের করতে হবে। দয়া করে নোট করুন ইনপুট অবশ্যই শর্ত পূরণ করতে হবে যে k < n-এ বিট সংখ্যা।

উদাহরণ

  • মনে করুন n = 9 এবং k = 2
  • 9-এর বাইনারি রিপ্রেজেন্টেশন - 1001। এতে ৪টি বিট আছে।
  • ২ সেট বিটস সহ সর্বোচ্চ ৪ ডিজিট বাইনারি নম্বর - 1100 অর্থাৎ ১২
  • 1001 কে 1100 এ কনভার্ট করতে হাইলাইট করা ২টি বিট ফ্লিপ করতে হবে

অ্যালগরিদম

1. n-এ বিট সংখ্যা কাউন্ট করো। এটাকে bitCount ভেরিয়েবল বলব। আমরা math লাইব্রেরি থেকে log2(n) ফাংশন ব্যবহার করতে পারি:
    bitCount = log2(n) + 1;
2. k সেট বিটস সহ সর্বোচ্চ নম্বর বের করো:
    maxNum = pow(2, k) - 1;
3. n-এর সমান বিট সংখ্যা সহ k সেট বিটস যুক্ত সর্বোচ্চ সম্ভাব্য নম্বর বের করো:
    maxNum = maxNum << (bitCount - k);
4. (n ^ maxNum) ক্যালকুলেট করো এবং সেট বিটস কাউন্ট করো।

উদাহরণ (C++ কোড)

#include <iostream>
#include <cmath>
using namespace std;

int getSetBits(int n) {
    int cnt = 0;
    while (n) {
        ++cnt;
        n = n & (n - 1);
    }
    return cnt;
}

int minFlipsRequired(int n, int k) {
    int bitCount, maxNum, flipCount;
    bitCount = log2(n) + 1;
    maxNum = pow(2, k) - 1;
    maxNum = maxNum << (bitCount - k);
    flipCount = n ^ maxNum;
    return getSetBits(flipCount);
}

int main() {
    cout << "Minimum required flips: " << minFlipsRequired(9, 2) << "\n";
    return 0;
}

আউটপুট

Minimum required flips: 2
  1. সি++-এ বাইনারি ম্যাট্রিক্সকে শূন্য ম্যাট্রিক্সে রূপান্তর করার জন্য ন্যূনতম ফ্লিপ সংখ্যা

  2. C++-এ K গ্লাস ভরতে মিনিমাম বোতল সংখ্যা

  3. C++-এ একটি সংখ্যার বাইনারিতে অল্টারনেট প্যাটার্ন আছে কিনা তা যাচাই করা (সেট ১)

  4. C++-এ সেট বিট কাউন্ট অনুযায়ী অ্যারে সর্ট করা