#include <bits/stdc++.h>
using namespace std;
int optimalmerge(vector <int>files)
{
priority_queue<int , vector<int>,greater<int>> minHeap;
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+=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;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgb3B0aW1hbG1lcmdlKHZlY3RvciA8aW50PmZpbGVzKQp7CiAgICBwcmlvcml0eV9xdWV1ZTxpbnQgLCB2ZWN0b3I8aW50PixncmVhdGVyPGludD4+IG1pbkhlYXA7IAogICAgZm9yKGludCBpID0wOyBpPCBmaWxlcy5zaXplKCk7aSsrKQogICAgewogICAgICAgIG1pbkhlYXAucHVzaChmaWxlc1tpXSk7CiAgICB9CiAgICBpbnQgdG90YWxjb3N0ID0gMDsKICAgIHdoaWxlKG1pbkhlYXAuc2l6ZSgpPjEpCiAgICB7CiAgICAgICAgaW50IGZpcnN0ID0gbWluSGVhcC50b3AoKTsKICAgICAgICBtaW5IZWFwLnBvcCgpOwogICAgICAgIGludCBzZWNvbmQgPSBtaW5IZWFwLnRvcCgpOwogICAgICAgIG1pbkhlYXAucG9wKCk7CiAgICAgICAgaW50IG1lcmdlZGNvc3QgPSBmaXJzdCArIHNlY29uZDsKICAgICAgICB0b3RhbGNvc3QrPW1lcmdlZGNvc3Q7CiAgICAgICAgbWluSGVhcC5wdXNoKG1lcmdlZGNvc3QpOwogICAgfQogICAgcmV0dXJuIHRvdGFsY29zdDsKfQoKaW50IG1haW4oKQp7Cgl2ZWN0b3I8aW50PmZpbGVzID0gezIwLDMwLDEwLDUsMzB9OwoJaW50IGNvc3QgPSBvcHRpbWFsbWVyZ2UoZmlsZXMpOwoKCWNvdXQgPDwiTWluaW11bSBjb3N0ID0gIiA8PCBjb3N0IDw8IGVuZGw7CgoJcmV0dXJuIDA7Cn0K