আমাদের N আকারের পূর্ণসংখ্যার একটি বিন্যাস এবং একটি সংখ্যা k দেওয়া হয়েছে৷ অ্যারে এলোমেলো ক্রমে পূর্ণসংখ্যা নিয়ে গঠিত। কাজটি হল k-এলিমেন্টের গ্রুপ এবং বাকি অ্যারের মধ্যে সর্বাধিক পার্থক্য খুঁজে বের করা। অ্যারে দুটি ভাগে বিভক্ত হবে। প্রথম অংশটি কে-এলিমেন্টের একটি গ্রুপ বের করা হয়েছে এবং দ্বিতীয় অংশটি অ্যারের বাকি উপাদানগুলি। আমাদের k উপাদান নির্বাচন করতে হবে যাতে উভয় গ্রুপের উপাদানগুলির যোগফলের মধ্যে পার্থক্য সর্বাধিক হয়।
যদি k ছোট হয় (<=অ্যারের আকারের অর্ধেক) তাহলে সবচেয়ে ছোট k উপাদানের সর্বনিম্ন যোগফল হবে এবং বাকি N-k উপাদানগুলির যোগফল সবচেয়ে বেশি হবে। সুতরাং সর্বাধিক পার্থক্য হল − (বাকী N-k উপাদানের যোগফল) - (সবচেয়ে ছোট k-উপাদানের যোগফল)।
যদি k বড় হয় (> অ্যারের আকারের অর্ধেক) তাহলে সবচেয়ে বড় k উপাদানগুলির যোগফল সবচেয়ে বেশি হবে এবং বাকি N-k উপাদানগুলির সর্বনিম্ন যোগফল থাকবে। তাই সর্বাধিক পার্থক্য হল (সবচেয়ে বড় কেলিমেন্টের যোগফল) - (বাকি N-k উপাদানের যোগফল)।
ইনপুট
Arr[] = { 2,5,6,1,3,2,1,4 }. k=3
আউটপুট − k-এলিমেন্টের গ্রুপ এবং বাকি অ্যারের মধ্যে সর্বোচ্চ পার্থক্য − 16
ব্যাখ্যা − এখানে k ছোট তাই সর্বনিম্ন ৩টি সংখ্যার যোগফল সবচেয়ে ছোট হবে।
সর্বনিম্ন 3টি সংখ্যা − 1,1,2 যোগফল=4
বাকি N-k =5 সংখ্যা:2,3,4,5,6 যোগফল=20
সর্বাধিক পার্থক্য:20-4 =16
ইনপুট
Arr[] = { 2,2,3,4,8,3,4,4,8,7 }. k=6
আউটপুট − k-এলিমেন্টের গ্রুপ এবং বাকি অ্যারের মধ্যে সর্বোচ্চ পার্থক্য − 25
ব্যাখ্যা − এখানে k বড় তাই সর্বোচ্চ 6 সংখ্যার যোগফল সবচেয়ে বেশি হবে।
সর্বোচ্চ 6 সংখ্যা − 8,8,7,4,4,4, যোগফল=35
বাকি N-k =4 সংখ্যা − 2,2,3,3 যোগফল=10
সর্বাধিক পার্থক্য − 35-10=
নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতিটি নিম্নরূপ
-
পূর্ণসংখ্যার একটি অ্যারে ঘোষণা করুন যা এলোমেলো ক্রমে ধারণ করে।( Arr[] )
-
অ্যারের আকার সংরক্ষণ করার জন্য একটি ভেরিয়েবল তৈরি করুন। (N)
-
ফাংশন maxKDiff( int Arr[],int n, int k) একটি অ্যারের মধ্যে একটি উপাদানের প্রথম এবং শেষ সূচকগুলির মধ্যে সর্বাধিক পার্থক্য (maxD) গণনা করতে ব্যবহৃত হয়৷
-
পুরো অ্যারের যোগফল গণনা করুন এবং আরসামে সংরক্ষণ করুন।
-
প্রথম জিনিসটি হল ন্যূনতম k উপাদানগুলির যোগফল গণনা করা। লুপের জন্য ব্যবহার করা হচ্ছে ( i=0;i
k ছোট হলে সবচেয়ে ছোট k উপাদানের সর্বনিম্ন যোগফল −
হবে -
D1-এ abs((পুরো অ্যারের যোগফল) - (2*সর্বনিম্ন k উপাদানের যোগফল))। দুবার কারণ অ্যারের সমষ্টিতেও এই উপাদানগুলি রয়েছে৷
৷k এর চেয়ে বড় k উপাদানের সর্বোচ্চ যোগফল −
হবে -
D2-এ abs((পুরো অ্যারের যোগফল) - (2*সর্বোচ্চ k উপাদানের যোগফল))। দুবার কারণ অ্যারের সমষ্টিতেও এই উপাদানগুলি রয়েছে৷
৷ -
D2 এর সাথে D1 তুলনা করুন এবং সর্বাধিক মান maxD-এ সংরক্ষণ করুন।
-
ফলাফল হিসাবে maxD ফেরত দিন।
উদাহরণ
#include <stdio.h> #include <math.h> // function for finding maximum group difference of array int maxKDiff (int arr[], int n, int k){ // sum of array int arrsum = 0; int i; for(i=0;i<n;i++) arrsum+=arr[i]; //sum of smallest k int sumk=0; for(i=0;i<k;i++) sumk+=arr[i]; // difference for k-smallest int D1 = abs(arrsum - 2*sumk); //sum of largest k elements sumk=0; int j=0; for(i=n-1;j<4;i--){ sumk+=arr[i]; j++; } // difference for k-largest int D2 = abs(arrsum - 2*sumk); int maxD=D1>=D2?D1:D2; // return maximum difference value return maxD; } // driver program int main(){ int arr[] ={ 2,3,2,10,7,12,8}; int n = 7; int k = 3; sort(arr,n); // to sort array in ascending order printf("Maximum difference between the group of k-elements and rest of the array : %d" , maxKDiff(arr,n,k)); return 0; }
আউটপুট
যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −
উৎপন্ন করবেMaximum difference between the group of k-elements and rest of the array : 30