สมมติว่าเรามีแท่งไม้ที่มีความยาวจำนวนเต็มบวก เราสามารถเชื่อมไม้ที่มีความยาว X และ Y สองแท่งเข้าด้วยกันเป็นแท่งเดียวโดยจ่ายราคา X + Y การดำเนินการนี้จะดำเนินการจนกว่าจะเหลือแท่งเดียว เราต้องหาต้นทุนขั้นต่ำในการเชื่อมต่อแท่งที่ให้มาทั้งหมดเป็นแท่งเดียวด้วยวิธีนี้ ดังนั้นหากสแต็กเป็น [2,4,3] ผลลัพธ์จะเป็น 14
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนด pq คิวลำดับความสำคัญสูงสุดของฮีป
- แทรกองค์ประกอบทั้งหมดของ s ลงใน pq
- ตอบ :=0
- ในขณะที่ pq มีมากกว่าหนึ่งองค์ประกอบ
- temp :=ด้านบนของคิว ลบ top จาก pq
- temp :=temp + องค์ประกอบด้านบนของ pq และลบออกจาก pq
- ans :=ans + อุณหภูมิ
- ใส่อุณหภูมิลงใน pq
- คืนสินค้า
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h> using namespace std; class Solution { public: int connectSticks(vector<int>& s) { priority_queue <int, vector<int>, greater<int> > pq; for(int i =0;i<s.size();i++)pq.push(s[i]); int ans = 0; while(pq.size()>1){ int temp = pq.top(); pq.pop(); temp += pq.top(); pq.pop(); ans+=temp; pq.push(temp); } return ans; } }; main(){ vector<int> v = {2,4,3}; Solution ob; cout <<ob.connectSticks(v); }
อินพุต
[2,4,3]
ผลลัพธ์
14