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

C++ ব্যবহার করে অ্যারের সব এলিমেন্ট সমান করতে ন্যূনতম মুভ সংখ্যা

সমস্যা বিবরণ

N এলিমেন্টের একটি অ্যারে এবং একটি পূর্ণসংখ্যা K দেওয়া আছে। নিচের অপারেশন যেকোনোবার করা যাবে:

  • K-তম এলিমেন্টটি অ্যারের শেষে যোগ করুন এবং অ্যারের প্রথম এলিমেন্টটি ডিলিট করুন।

অ্যারের সব এলিমেন্ট সমান করতে ন্যূনতম কতগুলো মুভ দরকার তা বের করতে হবে। সম্ভব না হলে -১ প্রিন্ট করুন।

যদি arr[] = {1, 2, 3, 4, 5, 6} এবং k = 6 হয়, তবে ন্যূনতম ৫টি মুভ দরকার:
Move-1: {2, 3, 4, 5, 6, 6}
Move-2: {3, 4, 5, 6, 6, 6}
Move-3: {4, 5, 6, 6, 6, 6}
Move-4: {5, 6, 6, 6, 6, 6}
Move-5: {6, 6, 6, 6, 6, 6}

এলগরিদম

1. প্রথমে a[k]-কে শেষে কপি করুন, তারপর a[k+1] এবং এভাবে চলতে থাকুন
2. শুধু সমান এলিমেন্ট কপি হয় তা নিশ্চিত করতে, K থেকে N পর্যন্ত সব এলিমেন্ট সমান হতে হবে। ১ থেকে K এর মধ্যে a[k]-এর সাথে অসমান এলিমেন্টগুলো সরিয়ে ফেলতে হবে
3. ১ থেকে K এর রেঞ্জে ডানপাশের যে এলিমেন্ট a[k]-এর সাথে অসমান, সেটি পাওয়া পর্যন্ত অপারেশন চালিয়ে যান।

উদাহরণ কোড

#include <iostream>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;

int getMinMoves(int *arr, int n, int k) {
    int i;
    for (i = k - 1; i < n; ++i) {
        if (arr[i] != arr[k - 1]) {
            return -1;
        }
    }
    for (i = k - 1; i >= 0; --i) {
        if (arr[i] != arr[k - 1]) {
            return i + 1;
        }
    }
    return 0;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6};
    int k = 6;
    cout << "Minimum moves required = " << getMinMoves(arr, SIZE(arr), k) << endl;
    return 0;
}

আউটপুট

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

Minimum moves required = 5
  1. C++ ব্যবহার করে XOR সর্বোচ্চ করার জন্য ন্যূনতম এলিমেন্ট অপসারণ

  2. C++ ব্যবহার করে মেডিয়ান x করার জন্য অ্যারেতে যোগ করার ন্যূনতম এলিমেন্ট সংখ্যা

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

  4. C++-এ অ্যারের সব এলিমেন্ট একই করার জন্য ন্যূনতম ডিলিট অপারেশন