import heapq
class Node:
def __init__(self, weight):
self.left = None
self.right = None
self.weight = weight
def __lt__(self, other):
return self.weight < other.weight
def build_huffman_tree(weights):
nodes = [Node(w) for w in weights]
heapq.heapify(nodes)
while len(nodes) > 1:
left = heapq.heappop(nodes)
right = heapq.heappop(nodes)
parent = Node(left.weight + right.weight)
parent.left = left
parent.right = right
heapq.heappush(nodes, parent)
return nodes[0]
def encode(root, prefix="", encoding={}):
if root.left is None and root.right is None:
encoding[root.weight] = prefix
if root.left:
encode(root.left, prefix + "0", encoding)
if root.right:
encode(root.right, prefix + "1", encoding)
return encoding
def get_sum(node, depth):
if node is None:
return 0
if node.left is None and node.right is None:
return depth * node.weight
return get_sum(node.left, depth + 1) + get_sum(node.right, depth + 1)
def huffman_tree(weights):
root_node = build_huffman_tree(weights)
encoding = encode(root_node)
return get_sum(root_node, 0)
while True:
try:
n = int(input().strip())
weights = list(map(int, input().strip().split()))
print(huffman_tree(weights))
except:
break