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

C++-এ সর্বোচ্চ ১টি সোয়াপ ব্যবহার করে নির্দিষ্ট বিন্দুর সর্বোচ্চ সংখ্যা


সমস্যা বিবরণ

0 থেকে N-1 পর্যন্ত Nটি উপাদানের একটি পারমিউটেশন দেওয়া আছে। একটি নির্দিষ্ট বিন্দু (fixed point) হলো এমন একটি ইনডেক্স যেখানে মানটি ইনডেক্সের সমান অর্থাৎ arr[i] = i। আপনাকে সর্বোচ্চ ১টি সোয়াপ করার অনুমতি আছে। আপনি সর্বোচ্চ কতগুলো নির্দিষ্ট বিন্দু পেতে পারেন তা বের করুন।

উদাহরণ

ইনপুট অ্যারে যদি {0, 1, 2, 3, 4, 6, 5} হয়, তবে উত্তর হবে ৭।

  • নির্দিষ্ট বিন্দু সমন্বয় করার জন্য ৬ এবং ৫ কে সোয়াপ করতে হবে
  • এতে পুরো অ্যারেটিই নির্দিষ্ট বিন্দু হয়ে যায় এবং নির্দিষ্ট বিন্দুর সর্বোচ্চ মান ৭ হয়।

অ্যালগরিদম

  • একটি pos অ্যারে তৈরি করুন যা ইনপুট অ্যারেতে প্রতিটি উপাদানের অবস্থান সংরক্ষণ করবে
  • এখন অ্যারেটি ট্রাভার্স করুন এবং নিচের কেসগুলো যাচাই করুন −
    • যদি a[i] = i হয়। তবে কাউন্ট বাড়িয়ে এগিয়ে যান
    • যদি pos[i] = a[i] হয়, অর্থাৎ ২টি পদ সোয়াপ করলে i এবং a[i] উভয়ই নির্দিষ্ট বিন্দু হয়ে যাবে, ফলে কাউন্ট ২ বাড়বে। মনে রাখবেন সোয়াপ সর্বোচ্চ ১বার করা যায়।
  • ট্রাভার্সাল শেষে, যদি কোনো সোয়াপ করা না থাকে, অর্থাৎ সোয়াপ করে কাউন্ট ২ বাড়ানো সম্ভব হয়নি, তবে যদি কমপক্ষে ২টি উপাদান নির্দিষ্ট বিন্দু না হয়, তবে ১টি সোয়াপ করে কাউন্ট ১ বাড়ানো যাবে, অর্থাৎ তাদের মধ্যে একটিকে নির্দিষ্ট বিন্দু বানানো যাবে।

উদাহরণ

#include <bits/stdc++.h> using namespace std; int getMaximumFixedPoints(int arr[], int n) {    int i, pos[n], count = 0, swapped = 0;    for (i = 0; i < n; i++)    pos[arr[i]] = i;    for (i = 0; i < n; i++) {       if (arr[i] == i) {          count++;       } else if (swapped == 0 && pos[i] == arr[i]) {          count += 2;          swapped = 1;       }    }    if (swapped == 0 && count < n - 1) {       count++;    }    return count; } int main() {    int arr[] = {0, 1, 2, 3, 4, 6, 5};    int n = sizeof(arr) / sizeof(arr[0]);    cout << "Maximum value of fixed point = " << getMaximumFixedPoints(arr, n) << endl;    return 0; }

আউটপুট

প্রোগ্রামটি কম্পাইল ও এক্সিকিউট করলে নিচের আউটপুট পাওয়া যাবে −

Maximum edges = 7

  1. C++-এ দিয়ে गये পয়েন্ট থেকে সম্ভাব্য কোয়াড্রিল্যাটারেল সংখ্যা বের করুন

  2. C++-এ সেভেন সেগমেন্ট ডিসপ্লেতে N সেগমেন্ট দিয়ে প্রদর্শনযোগ্য সর্বোচ্চ সংখ্যা

  3. C++-এ ১ থেকে n পর্যন্ত Kটি সংখ্যা ব্যবহার করে সর্বোচ্চ XOR (Maximum XOR using K Numbers from 1 to n)

  4. C++ ব্যবহার করে XOR সর্বোচ্চ করার জন্য ন্যূনতম এলিমেন্ট অপসারণ