এই সমস্যায়, আমাদেরকে N পূর্ণসংখ্যার একটি অ্যারে [] এবং একটি পূর্ণসংখ্যা m দেওয়া হয়েছে। আমাদের কাজ হল অ্যারে থেকে সর্বাধিকগুলি খুঁজে বের করার জন্য একটি প্রোগ্রাম তৈরি করা যখন প্রতিটি অ্যাক্সেসের পরে সর্বাধিক হ্রাস পায়৷
সমস্যা বর্ণনা − আমাদের অ্যারের সর্বাধিক উপাদানগুলির সর্বাধিক যোগফল খুঁজে বের করতে হবে এবং সর্বোচ্চ এক k বার কমাতে হবে৷
সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,
ইনপুট
arr[] = {3, 6, 7, 8, 8}, k = 3 আউটপুট
ব্যাখ্যা
First iteration: array before = {3, 6, 7, 8, 8}, max = 8, sum = 8, array after update = {3, 6, 7, 7, 8}
Second iteration: array before = {3, 6, 7, 7, 8}, max = 8, sum = 8 + 8 = 16, array after update = {3, 6, 7, 7, 7}
Third iteration: array before = {3, 6, 7, 7, 7}, max = 7, sum = 16 + 7 = 23, array after update = {3, 6, 6, 7, 7}
Maximum sum = 23 সমাধান পদ্ধতি
ধারণা হল অ্যারের সর্বাধিক খুঁজে বের করা এবং তারপর maxSum যোগ করার পরে এটি হ্রাস করা। এই প্রক্রিয়াটি k বার পুনরাবৃত্তি করলে ফলাফল পাওয়া যায়।
অ্যারের সর্বাধিক উপাদান খুঁজে বের করার জন্য, একাধিক উপায় হতে পারে এবং সবচেয়ে প্রতিশ্রুতিশীলটি হল সর্বাধিক হিপ ডেটা স্ট্রাকচার ব্যবহার করা৷
সুতরাং, আমরা অ্যারের সমস্ত উপাদান একটি সর্বাধিক হিপে সন্নিবেশ করব, হিপের সর্বাধিক উপাদানটি এটির মূলে উপস্থাপন করা হয়েছে। আমরা এটি মুছে ফেলব, maxSum-এ যোগ করব এবং হিপে ফিরে (এলিমেন্ট -1) সন্নিবেশ করব। কাঙ্খিত ম্যাক্সসাম পেতে এটি k বার করুন।
অ্যালগরিদম
শুরু করুন − maxSum =0
ধাপ 1 - একটি সর্বাধিক হিপ ডেটা স্ট্রাকচার তৈরি করুন এবং এতে উপাদানগুলিকে পুশ করুন৷
৷ধাপ 2 − i -> 0 থেকে k এর জন্য লুপ করুন এবং সেট 3 - 5 অনুসরণ করুন।
ধাপ 3 − রুট এলিমেন্ট নিন, maxVal =রুট এবং পপ করুন।
পদক্ষেপ 4৷ − maxVal যোগ করুন maxSum, maxSum +=maxVal
ধাপ 5 − সর্বাধিক হিপে আপডেট করা maxVal ঢোকান৷
৷ধাপ 6 - maxSum ফেরত দিন।
আমাদের সমাধানের কাজ চিত্রিত করার জন্য প্রোগ্রাম,
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
long calcMaxSumDec(int arr[], int m, int n) {
long maxSum = 0;
long maxVal;
priority_queue<long> max_heap;
for (int i = 0; i < n; i++) {
max_heap.push(arr[i]);
}
for(int i = 0; i < m; i++) {
maxVal = max_heap.top();
maxSum += maxVal;
max_heap.pop();
max_heap.push(maxVal - 1);
}
return maxSum;
}
int main() {
int arr[] = { 2, 3, 5, 4 }, m = 3;
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The maximums from array when the maximum decrements after every access is "<<calcMaxSumDec(arr, m, n);
} আউটপুট
The maximums from array when the maximum decrements after every access is 13