সমস্যা বিবৃতি
N পূর্ণসংখ্যা এবং K দেওয়া, ন্যূনতম সংখ্যক উপাদানগুলি খুঁজে বের করুন যা অপসারণ করা উচিত যেমন Amax - Amin <=K. উপাদানগুলি অপসারণের পরে, Amax এবং Amin বাকি উপাদানগুলির মধ্যে বিবেচনা করা হয়
উদাহরণ
যদি arr[] ={1, 3, 4, 9, 10, 11, 12, 17, 20} এবং k =4 হয় তাহলে আউটপুট হবে 5:
- একটি অ্যারের শুরু থেকে 1, 3 এবং 4 সরান
- অ্যারের শেষ থেকে 17 এবং 20 সরান
- ফাইনাল অ্যারে হয়ে যায় {9, 10, 11, 12} যেখানে 12 – 9 <=4
অ্যালগরিদম
<পূর্ব>1. প্রদত্ত উপাদানগুলি সাজান 2। লোভী পন্থা ব্যবহার করে, সর্বোত্তম উপায় হল ন্যূনতম উপাদান বা সর্বাধিক উপাদানটি সরিয়ে ফেলা এবং তারপরে পরীক্ষা করা যে Amax - Amin <=K। অপসারণের বিভিন্ন সমন্বয় রয়েছে যা বিবেচনা করতে হবে।3। অপসারণের দুটি সম্ভাব্য উপায় থাকবে, হয় আমরা সর্বনিম্নটি সরিয়ে ফেলি বা সর্বোচ্চটি সরিয়ে ফেলি। যাক (i…j) উপাদানগুলি অপসারণের পরে অবশিষ্ট উপাদানগুলির সূচী। প্রাথমিকভাবে, আমরা i=0 এবং j=n-1 দিয়ে শুরু করি এবং শুরুতে সরানো উপাদানের সংখ্যা 0।4। আমরা শুধুমাত্র একটি উপাদান সরিয়ে ফেলি যদি a[j]-a[i]>k, অপসারণের দুটি সম্ভাব্য উপায় হল (i+1…j) বা (i…j-1)। দুটির মধ্যে সর্বনিম্ন বিবেচনা করা হয়উদাহরণ
#include#define MAX 100 useing namespace std;int dp[MAX][MAX];int remove Combinations(int *arr, int i, int j, int k) { if (i>=j) { ফেরত 0; } অন্যথায় যদি ((arr[j] - arr[i]) <=k) { ফেরত 0; } অন্যথায় যদি (dp[i][j] !=-1) { রিটার্ন dp[i][j]; } অন্যথায় যদি ((arr[j] - arr[i])> k) { dp[i][j] =1 + min(removeCombinations(arr, i + 1, j, k), রিমুভ কম্বিনেশন(arr, i, j - 1,k)); } রিটার্ন dp[i][j];}int removeNumbers(int *arr, int n, int k){ sort(arr, arr + n); memset(dp, -1, sizeof(dp)); রিটার্ন n ==1? 0 :রিমুভ কম্বিনেশন(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 <<"সরানো সর্বনিম্ন সংখ্যা =" < আপনি যখন উপরের প্রোগ্রামটি কম্পাইল এবং এক্সিকিউট করবেন। এটি নিম্নলিখিত আউটপুট তৈরি করে
আউটপুট
সরানো সর্বনিম্ন সংখ্যা =5