#include<bits/stdc++.h>
using namespace std;
int optimalmerge(vector<int>files)
{
priority_queue<int, vector<int>, greater<int> >minHeap;
priority_queue<int>maxHeap;
for(int i = 0; i < files.size(); i++)
{
minHeap.push(files[i]);
}
int totalcost = 0;
while(minHeap.size() > 1)
{
int first = minHeap.top();
minHeap.pop();
int second = minHeap.top();
minHeap.pop();
int mergedcost = first+second;
totalcost = totalcost+mergedcost;
minHeap.push(mergedcost);
}
return totalcost;
}
int main()
{
vector<int>files = {20, 30, 10, 5, 30};
int cost = optimalmerge(files);
cout<<"Minimum Cost = "<<cost<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBvcHRpbWFsbWVyZ2UodmVjdG9yPGludD5maWxlcykKewogICAgcHJpb3JpdHlfcXVldWU8aW50LCB2ZWN0b3I8aW50PiwgZ3JlYXRlcjxpbnQ+ID5taW5IZWFwOwogICAgcHJpb3JpdHlfcXVldWU8aW50Pm1heEhlYXA7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspCiAgICB7CiAgICAgICAgbWluSGVhcC5wdXNoKGZpbGVzW2ldKTsKICAgIH0KCiAgICBpbnQgdG90YWxjb3N0ID0gMDsKICAgIHdoaWxlKG1pbkhlYXAuc2l6ZSgpID4gMSkKICAgIHsKICAgICAgICBpbnQgZmlyc3QgPSBtaW5IZWFwLnRvcCgpOwogICAgICAgIG1pbkhlYXAucG9wKCk7CiAgICAgICAgaW50IHNlY29uZCA9IG1pbkhlYXAudG9wKCk7CiAgICAgICAgbWluSGVhcC5wb3AoKTsKCiAgICAgICAgaW50IG1lcmdlZGNvc3QgPSBmaXJzdCtzZWNvbmQ7CiAgICAgICAgdG90YWxjb3N0ID0gdG90YWxjb3N0K21lcmdlZGNvc3Q7CgogICAgICAgIG1pbkhlYXAucHVzaChtZXJnZWRjb3N0KTsKCiAgICB9CiAgICByZXR1cm4gdG90YWxjb3N0Owp9CgppbnQgbWFpbigpCnsKICAgIHZlY3RvcjxpbnQ+ZmlsZXMgPSB7MjAsIDMwLCAxMCwgNSwgMzB9OwoKICAgIGludCBjb3N0ID0gb3B0aW1hbG1lcmdlKGZpbGVzKTsKCiAgICBjb3V0PDwiTWluaW11bSBDb3N0ID0gIjw8Y29zdDw8ZW5kbDsKfQo=