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

অ্যারে থেকে এলিমেন্ট রিমুভ করে Max - Min <= K করা C++-তে


সমস্যা বিবরণ

Nটি ইন্টিজার এবং K দেওয়া আছে, ন্যূনতম কতগুলো এলিমেন্ট সরাতে হবে যাতে Amax - Amin <= K। এলিমেন্ট সরানোর পর Amax এবং Amin বাকি এলিমেন্টগুলোর মধ্যে থেকে বিবেচনা করা হবে।

উদাহরণ

arr[] = {1, 3, 4, 9, 10, 11, 12, 17, 20} এবং k = 4 হলে আউটপুট ৫:

  • অ্যারের শুরু থেকে ১, ৩, ৪ সরান
  • অ্যারের শেষ থেকে ১৭, ২০ সরান
  • ফাইনাল অ্যারে: {9, 10, 11, 12} যেখানে 12 - 9 <= 4

অ্যালগরিদম

1. দেওয়া এলিমেন্টগুলো সর্ট করুন।
2. গ্রিডি পদ্ধতিতে, সেরা উপায় হলো ন্যূনতম বা সর্বোচ্চ এলিমেন্ট সরিয়ে চেক করা যে Amax - Amin <= K। রিমUভালের বিভিন্ন কম্বিনেশন বিবেচনা করতে হবে।
3. রিমUভালের দুটি সম্ভাব্য পথ: ন্যূনতম সরান অথবা সর্বোচ্চ সরান। Let(i...j) হোক রিমUভালের পর বাকি এলিমেন্টের ইনডেক্স। শুরুতে i=0, j=n-1 এবং রিমUভাল করা এলিমেন্ট ০।
4. শুধু তখনই এলিমেন্ট সরাব যখন a[j]-a[i]>k, দুটি সম্ভাব্য পথ: (i+1...j) বা (i...j-1)। দুটির ন্যূনতম নেওয়া হবে।

উদাহরণ

#include <bits/stdc++.h>
#define MAX 100
using namespace std;
int dp[MAX][MAX];
int removeCombinations(int *arr, int i, int j, int k) {
    if (i >= j) {
        return 0;
    } else if ((arr[j] - arr[i]) <= k) {
        return 0;
    } else if (dp[i][j] != -1) {
        return dp[i][j];
    } else if ((arr[j] - arr[i]) > k) {
        dp[i][j] = 1 + min(removeCombinations(arr, i + 1, j, k),
            removeCombinations(arr, i, j - 1, k));
    }
    return dp[i][j];
}
int removeNumbers(int *arr, int n, int k){
    sort(arr, arr + n);
    memset(dp, -1, sizeof(dp));
    return n == 1 ? 0 : removeCombinations(arr, 0, n - 1, k);
}
int main() {
    int arr[] = {1, 3, 4, 9, 10, 11, 12, 17, 20};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 4;
    cout << "Minimum numbers to be removed = " << removeNumbers(arr, n, k) << endl;
    return 0;
}

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

আউটপুট

Minimum numbers to be removed = 5

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

  2. C++-এ কো-প্রাইম অ্যারে बनाने জন্য ন্যূনতম ইনসারশন

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

  4. পাইথনে অ্যারে থেকে ন্যূনতম অপসারণ করিয়ে GCD বড় করুন