ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ของจำนวนเต็ม 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 ที่ต้องการ
อัลกอริทึม
เริ่มต้น − maxSum =0
ขั้นตอนที่ 1 − สร้างโครงสร้างข้อมูลฮีปสูงสุดและผลักองค์ประกอบเข้าไป
ขั้นตอนที่ 2 − วนรอบสำหรับ i -> 0 ถึง k และติดตามชุดที่ 3 - 5
ขั้นตอนที่ 3 − นำองค์ประกอบรูท maxVal =root แล้วป๊อปอัป
ขั้นตอนที่ 4 − เพิ่ม maxVal ให้กับ maxSum, maxSum +=maxVal
ขั้นตอนที่ 5 − แทรก maxVal ที่อัปเดตไปยังฮีปสูงสุด
ขั้นตอนที่ 6 − ส่งคืนผลรวมสูงสุด
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#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