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

C++-এ অ্যারে প্যালিনড্রোম बनाने के জন্য ন্যূনতম মার্জ অপারেশন খুঁজুন

এই সমস্যায়, আমাদের একটি অ্যারে arr[] দেওয়া আছে যাতে n সংখ্যক ধনাত্মক সংখ্যা থাকে। আমাদের কাজ হলো অ্যারেটিকে প্যালিনড্রোম बनाने জন্য ন্যূনতম মার্জ অপারেশন খুঁজে বের করা।

প্যালিনড্রোম অ্যারে

প্যালিনড্রোম অ্যারে প্যালিনড্রোম স্ট্রিং-এর মতো, যেখানে 인ডেক্স i এবং n-i-এ উপস্থিত উপাদানগুলো একই থাকে।

উদাহরণ

{5, 1, 7, 2, 7, 1, 5}

সমস্যা বিবরণ

আমাদের অ্যারেটিকে প্যালিনড্রোম করতে হবে এবং একমাত্র বৈধ অপারেশন হলো মার্জ অপারেশন যেখানে আমরা i এবং i+1 ইনডেক্সের উপাদানগুলো যোগ করব।

আমাদের প্রদত্ত অ্যারেটিকে প্যালিনড্রোম করার জন্য ন্যূনতম ilyen অপারেশন খুঁজে বের করতে হবে।

উদাহরণ

ইনপুট

arr[] = {4, 1, 7, 6, 1, 5}

আউটপুট

2

ব্যাখ্যা

আমাদের দুটি মার্জ অপারেশন দরকার:

  • ইনডেক্স ০ এবং ১-এ মার্জ করলে অ্যারে হয় {5, 7, 6, 1, 5}
  • তারপর ইনডেক্স ২ এবং ৩-এ মার্জ করলে অ্যারে হয় {5, 7, 7, 5}

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

সমস্যাটি সমাধানের একটি সহজ পদ্ধতি হলো টু পয়েন্টার ব্যবহার করে স্ট্রিং প্যালিনড্রোম করার মতো। আমরা start এবং end পয়েন্টার ব্যবহার করব। যদি দুটি পয়েন্টার মিলে যায় (start == end), তবে অ্যারেটি প্যালিনড্রোম। আমরা start এবং end পয়েন্টার দিয়ে লুপ চালাব এবং নিম্নলিখিত শর্তগুলো অনুযায়ী অপারেশন করব:

  • যদি arr[start] == arr[end], তবে বর্তমান ইনডেক্সের জন্য প্যালিনড্রোম শর্ত পূরণ হয়। আমরা তাদের পরবর্তী ইনডেক্সে নেব। অর্থাৎ start++ এবং end--।
  • যদি arr[start] > arr[end], তবে end ইনডেক্সের জন্য মার্জ অপারেশন করতে হবে এবং mergeCount ১ বাড়াব।
  • যদি arr[start] < arr[end], তবে start ইনডেক্সের জন্য মার্জ অপারেশন করতে হবে এবং mergeCount ১ বাড়াব।

start == end হলে merge count ফেরত দিব।

C++ প্রোগ্রাম উদাহরণ

#include <iostream>
using namespace std;

int findMergeCount(int arr[], int n){
    int mergeCount = 0;
    int start = 0;
    int end = n-1;
    while(start <= end){
        if (arr[start] == arr[end]){
            start++;
            end--;
        }
        else if (arr[start] > arr[end]){
            end--;
            arr[end] += arr[end+1];
            mergeCount++;
        }
        else {
            start++;
            arr[start] += arr[start-1];
            mergeCount++;
        }
    }
    return mergeCount;
}

int main(){
    int arr[] = {4, 1, 7, 6, 1, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << "The minimum number of merge operations required to make the array palindrome is " << findMergeCount(arr, n);
    return 0;
}

আউটপুট

The minimum number of merge operations required to make the array palindrome is 2
  1. C++ ব্যবহার করে অ্যারের সব এলিমেন্ট ০ করার ন্যূনতম অপারেশন সংখ্যা

  2. C++ ব্যবহার করে স্ট্রিংকে প্যালিনড্রোম করার ন্যূনতম ডিলিশন সংখ্যা

  3. C++-এ অ্যারের GCD কে k-এর গুণিতক বানানোর ন্যূনতম অপারেশন

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