Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค่าสูงสุดจากอาร์เรย์เมื่อค่าสูงสุดลดลงหลังการเข้าถึงทุกครั้งใน C++ Program


ในปัญหานี้ เราได้รับอาร์เรย์ 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