import java.util.ArrayList;
import java.util.List;
// import java.util.concurrent.ConcurrentHashMap;
// import java.util.concurrent.atomic.AtomicInteger;
// import java.lang.reflect.Array;
// import java.util.regex.MatchResult;
// import javax.management.AttributeList;
// import javax.xml.stream.events.Characters;
class Main {
public int minCostOfRopes(int[] arr) {
MyMinHeap minHeap = new MyMinHeap();
if (arr.length <= 1) {
return 0;
}
// PriorityQueue<Integer> minHeap = new PriorityQueue<>();
for (int rope : arr) {
minHeap.insert(rope);
}
int minCostRopeSum = 0;
while (minHeap.myHeap.size() != 1) {
int firstRope = minHeap.fetchMin();
int secondRope = minHeap.fetchMin();
int newRopeLength = firstRope + secondRope;
minCostRopeSum += newRopeLength;
minHeap.insert(newRopeLength);
}
return minCostRopeSum;
}
public static void main
(String[] args
) { Main solution = new Main();
int[] arr = new int[] { 4, 3, 2, 6 };
// MyMinHeap heap = new MyMinHeap();
System.
out.
println(solution.
minCostOfRopes(arr
));
}
}
class MyMinHeap {
List<Integer> myHeap;
public MyMinHeap() {
myHeap = new ArrayList<>();
}
public void insert(int val) {
myHeap.add(val);
sortArray(myHeap.size() - 1);
}
public void swap(int i, int j) {
int t = myHeap.get(i);
myHeap.set(i, myHeap.get(j));
myHeap.set(j, t);
}
public int fetchMin() {
if (myHeap.size() == 0)
return -1;
int minValue = myHeap.get(0);
int lastValue = myHeap.get(myHeap.size() - 1);
if (myHeap.size() != 0) {
myHeap.set(0, lastValue);
myHeap.remove(myHeap.size() - 1); // <-- THIS LINE IS CRUCIAL
sortArrayChild(0);
}
return minValue;
}
// . 0. 1. 2. 3
// [2, 3, 5, 6]
// parent = 1
public void sortArrayChild(int idx) {
int left = 2 * idx + 1;
int rightChild = 2 * idx + 2;
int currentNode = idx;
if (left < myHeap.size() && myHeap.get(left) < myHeap.get(currentNode)) {
System.
out.
println("Going in left" + currentNode
); currentNode = left;
}
if (rightChild < myHeap.size() && myHeap.get(rightChild) < myHeap.get(currentNode)) {
currentNode = rightChild;
}
if (currentNode != idx) {
System.
out.
println(currentNode
); swap(currentNode, idx);
sortArrayChild(currentNode);
}
}
public void sortArray(int idx) {
while (idx > 0) {
int node = (idx - 1) / 2;
if (myHeap.get(idx) < myHeap.get(node)) {
swap(idx, node);
idx = node;
} else {
break;
}
}
}
}
// [ 3, 5]
// [ 3, 5, 2]
// 2 < 3 -> [2, 5, 3]
// 0 1 2 3
// [2, 5, 3, 6]
// parent =
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCgovLyBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci8vIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLy8gaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwovLyBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0OwoKCi8vIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZUxpc3Q7CgoKLy8gaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uZXZlbnRzLkNoYXJhY3RlcnM7CgoKY2xhc3MgTWFpbiB7CgoKICAgcHVibGljIGludCBtaW5Db3N0T2ZSb3BlcyhpbnRbXSBhcnIpIHsKICAgICAgIE15TWluSGVhcCBtaW5IZWFwID0gbmV3IE15TWluSGVhcCgpOwogICAgICAgaWYgKGFyci5sZW5ndGggPD0gMSkgewogICAgICAgICAgIHJldHVybiAwOwogICAgICAgfQoKCiAgICAgICAvLyBQcmlvcml0eVF1ZXVlPEludGVnZXI+IG1pbkhlYXAgPSBuZXcgUHJpb3JpdHlRdWV1ZTw+KCk7CiAgICAgICBmb3IgKGludCByb3BlIDogYXJyKSB7CiAgICAgICAgICAgbWluSGVhcC5pbnNlcnQocm9wZSk7CiAgICAgICB9CgoKICAgICAgIGludCBtaW5Db3N0Um9wZVN1bSA9IDA7CgoKICAgICAgIHdoaWxlIChtaW5IZWFwLm15SGVhcC5zaXplKCkgIT0gMSkgewogICAgICAgICAgIGludCBmaXJzdFJvcGUgPSBtaW5IZWFwLmZldGNoTWluKCk7CiAgICAgICAgICAgaW50IHNlY29uZFJvcGUgPSBtaW5IZWFwLmZldGNoTWluKCk7CgoKICAgICAgICAgICBpbnQgbmV3Um9wZUxlbmd0aCA9IGZpcnN0Um9wZSArIHNlY29uZFJvcGU7CiAgICAgICAgICAgbWluQ29zdFJvcGVTdW0gKz0gbmV3Um9wZUxlbmd0aDsKCgogICAgICAgICAgIG1pbkhlYXAuaW5zZXJ0KG5ld1JvcGVMZW5ndGgpOwogICAgICAgfQogICAgICAgcmV0dXJuIG1pbkNvc3RSb3BlU3VtOwogICB9CgoKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgTWFpbiBzb2x1dGlvbiA9IG5ldyBNYWluKCk7CiAgICAgICBpbnRbXSBhcnIgPSBuZXcgaW50W10geyA0LCAzLCAyLCA2IH07CiAgICAgICAvLyBNeU1pbkhlYXAgaGVhcCA9IG5ldyBNeU1pbkhlYXAoKTsKCgogICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNvbHV0aW9uLm1pbkNvc3RPZlJvcGVzKGFycikpOwoKCiAgIH0KfQoKCmNsYXNzIE15TWluSGVhcCB7CiAgIExpc3Q8SW50ZWdlcj4gbXlIZWFwOwoKCiAgIHB1YmxpYyBNeU1pbkhlYXAoKSB7CiAgICAgICBteUhlYXAgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgfQoKCiAgIHB1YmxpYyB2b2lkIGluc2VydChpbnQgdmFsKSB7CiAgICAgICBteUhlYXAuYWRkKHZhbCk7CiAgICAgICBzb3J0QXJyYXkobXlIZWFwLnNpemUoKSAtIDEpOwogICB9CgoKICAgcHVibGljIHZvaWQgc3dhcChpbnQgaSwgaW50IGopIHsKICAgICAgIGludCB0ID0gbXlIZWFwLmdldChpKTsKICAgICAgIG15SGVhcC5zZXQoaSwgbXlIZWFwLmdldChqKSk7CiAgICAgICBteUhlYXAuc2V0KGosIHQpOwogICB9CgoKICAgcHVibGljIGludCBmZXRjaE1pbigpIHsKICAgICAgIGlmIChteUhlYXAuc2l6ZSgpID09IDApCiAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgaW50IG1pblZhbHVlID0gbXlIZWFwLmdldCgwKTsKCgogICAgICAgaW50IGxhc3RWYWx1ZSA9IG15SGVhcC5nZXQobXlIZWFwLnNpemUoKSAtIDEpOwogICAgICAgaWYgKG15SGVhcC5zaXplKCkgIT0gMCkgewogICAgICAgICAgIG15SGVhcC5zZXQoMCwgbGFzdFZhbHVlKTsKICAgICAgICAgICAgIG15SGVhcC5yZW1vdmUobXlIZWFwLnNpemUoKSAtIDEpOyAgLy8gPC0tIFRISVMgTElORSBJUyBDUlVDSUFMCgogICAgICAgICAgIHNvcnRBcnJheUNoaWxkKDApOwogICAgICAgfQogICAgICAgcmV0dXJuIG1pblZhbHVlOwogICB9CiAgIC8vIC4gMC4gMS4gMi4gMwogICAvLyBbMiwgMywgNSwgNl0KCgogICAvLyBwYXJlbnQgPSAxCgoKICAgcHVibGljIHZvaWQgc29ydEFycmF5Q2hpbGQoaW50IGlkeCkgewogICAgICAgaW50IGxlZnQgPSAyICogaWR4ICsgMTsKICAgICAgIGludCByaWdodENoaWxkID0gMiAqIGlkeCArIDI7CgoKICAgICAgIGludCBjdXJyZW50Tm9kZSA9IGlkeDsKICAgICAgIGlmIChsZWZ0IDwgbXlIZWFwLnNpemUoKSAmJiBteUhlYXAuZ2V0KGxlZnQpIDwgbXlIZWFwLmdldChjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvaW5nIGluIGxlZnQiICsgY3VycmVudE5vZGUpOwogICAgICAgICAgIGN1cnJlbnROb2RlID0gbGVmdDsKICAgICAgIH0KICAgICAgIGlmIChyaWdodENoaWxkIDwgbXlIZWFwLnNpemUoKSAmJiBteUhlYXAuZ2V0KHJpZ2h0Q2hpbGQpIDwgbXlIZWFwLmdldChjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHJpZ2h0Q2hpbGQ7CiAgICAgICB9CiAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gaWR4KSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1cnJlbnROb2RlKTsKICAgICAgICAgICBzd2FwKGN1cnJlbnROb2RlLCBpZHgpOwogICAgICAgICAgIHNvcnRBcnJheUNoaWxkKGN1cnJlbnROb2RlKTsKICAgICAgIH0KICAgfQoKCiAgIHB1YmxpYyB2b2lkIHNvcnRBcnJheShpbnQgaWR4KSB7CiAgICAgICB3aGlsZSAoaWR4ID4gMCkgewogICAgICAgICAgIGludCBub2RlID0gKGlkeCAtIDEpIC8gMjsKICAgICAgICAgICBpZiAobXlIZWFwLmdldChpZHgpIDwgbXlIZWFwLmdldChub2RlKSkgewogICAgICAgICAgICAgICBzd2FwKGlkeCwgbm9kZSk7CiAgICAgICAgICAgICAgIGlkeCA9IG5vZGU7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgfQogICB9Cn0KCgovLyBbIDMsIDVdCgoKLy8gWyAzLCA1LCAyXQoKCi8vIDIgPCAzIC0+IFsyLCA1LCAzXQoKCi8vIDAgMSAyIDMKLy8gWzIsIDUsIDMsIDZdCgoKLy8gcGFyZW50ID0K