class CandyStealer:
def __init__(self):
# erase prev output file
open('out', 'w').close()
@staticmethod
def get_next_case():
with open("in", "r") as fp:
in_data = fp.read()
# get rid of excess data
in_data = in_data.strip()
in_data = in_data.split("\n")[1:]
for i in range(len(in_data)):
if i % 2 != 0:
t_case = in_data[i].split(" ")
t_case = [int(x) for x in t_case]
yield t_case
@staticmethod
def sasha_add(n1, n2):
n1 = bin(int(n1))[2:]
n2 = bin(int(n2))[2:]
return int(n1, 2) ^ int(n2, 2)
def get_sasha_heap_sum(self, heap):
heap_sum = 0
for num in heap:
heap_sum = self.sasha_add(heap_sum, num)
return heap_sum
@staticmethod
def write_result(max_sum, case_num):
with open("out", "a") as fp:
addition = "NO" if max_sum == -1 else str(max_sum)
fp.write("Case #" + str(case_num) + ": " + addition + "\n")
@staticmethod
def get_heaps_by_mask(t_case, mask):
heap1 = []
heap2 = []
for i in range(len(mask)):
if mask[i] == "0":
heap1.append(int(t_case[i]))
else:
heap2.append(int(t_case[i]))
return heap1, heap2
def run(self):
case_num = 0
for t_case in self.get_next_case():
case_num += 1
combinations_count = (2 ** (len(t_case) - 1)) # all possible heaps
default_mask = ["0" * len(t_case)]
default_mask = "".join(default_mask)
max_gain = -1
for i in range(1, combinations_count):
mask = bin(i)[2:]
mask = default_mask[:-len(mask)] + mask
heap1, heap2 = self.get_heaps_by_mask(t_case, mask)
if self.get_sasha_heap_sum(heap1) == self.get_sasha_heap_sum(heap2):
current_gain = max(sum(heap1), sum(heap2))
if current_gain > max_gain:
max_gain = current_gain
self.write_result(max_gain, case_num)
if __name__ == "__main__":
CandyStealer().run()
Y2xhc3MgQ2FuZHlTdGVhbGVyOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIGVyYXNlIHByZXYgb3V0cHV0IGZpbGUKICAgICAgICBvcGVuKCdvdXQnLCAndycpLmNsb3NlKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZ2V0X25leHRfY2FzZSgpOgogICAgICAgIHdpdGggb3BlbigiaW4iLCAiciIpIGFzIGZwOgogICAgICAgICAgICBpbl9kYXRhID0gZnAucmVhZCgpCiAgICAgICAgICAgICMgZ2V0IHJpZCBvZiBleGNlc3MgZGF0YQogICAgICAgICAgICBpbl9kYXRhID0gaW5fZGF0YS5zdHJpcCgpCiAgICAgICAgICAgIGluX2RhdGEgPSBpbl9kYXRhLnNwbGl0KCJcbiIpWzE6XQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oaW5fZGF0YSkpOgogICAgICAgICAgICAgICAgaWYgaSAlIDIgIT0gMDoKICAgICAgICAgICAgICAgICAgICB0X2Nhc2UgPSBpbl9kYXRhW2ldLnNwbGl0KCIgIikKICAgICAgICAgICAgICAgICAgICB0X2Nhc2UgPSBbaW50KHgpIGZvciB4IGluIHRfY2FzZV0KICAgICAgICAgICAgICAgICAgICB5aWVsZCB0X2Nhc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc2FzaGFfYWRkKG4xLCBuMik6CiAgICAgICAgbjEgPSBiaW4oaW50KG4xKSlbMjpdCiAgICAgICAgbjIgPSBiaW4oaW50KG4yKSlbMjpdCiAgICAgICAgcmV0dXJuIGludChuMSwgMikgXiBpbnQobjIsIDIpCgogICAgZGVmIGdldF9zYXNoYV9oZWFwX3N1bShzZWxmLCBoZWFwKToKICAgICAgICBoZWFwX3N1bSA9IDAKICAgICAgICBmb3IgbnVtIGluIGhlYXA6CiAgICAgICAgICAgIGhlYXBfc3VtID0gc2VsZi5zYXNoYV9hZGQoaGVhcF9zdW0sIG51bSkKICAgICAgICByZXR1cm4gaGVhcF9zdW0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgd3JpdGVfcmVzdWx0KG1heF9zdW0sIGNhc2VfbnVtKToKICAgICAgICB3aXRoIG9wZW4oIm91dCIsICJhIikgYXMgZnA6CiAgICAgICAgICAgIGFkZGl0aW9uID0gIk5PIiBpZiBtYXhfc3VtID09IC0xIGVsc2Ugc3RyKG1heF9zdW0pCiAgICAgICAgICAgIGZwLndyaXRlKCJDYXNlICMiICsgc3RyKGNhc2VfbnVtKSArICI6ICIgKyBhZGRpdGlvbiArICJcbiIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGdldF9oZWFwc19ieV9tYXNrKHRfY2FzZSwgbWFzayk6CiAgICAgICAgaGVhcDEgPSBbXQogICAgICAgIGhlYXAyID0gW10KICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obWFzaykpOgogICAgICAgICAgICBpZiBtYXNrW2ldID09ICIwIjoKICAgICAgICAgICAgICAgIGhlYXAxLmFwcGVuZChpbnQodF9jYXNlW2ldKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGhlYXAyLmFwcGVuZChpbnQodF9jYXNlW2ldKSkKICAgICAgICByZXR1cm4gaGVhcDEsIGhlYXAyCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBjYXNlX251bSA9IDAKICAgICAgICBmb3IgdF9jYXNlIGluIHNlbGYuZ2V0X25leHRfY2FzZSgpOgogICAgICAgICAgICBjYXNlX251bSArPSAxCiAgICAgICAgICAgIGNvbWJpbmF0aW9uc19jb3VudCA9ICgyICoqIChsZW4odF9jYXNlKSAtIDEpKSAgIyBhbGwgcG9zc2libGUgaGVhcHMKICAgICAgICAgICAgZGVmYXVsdF9tYXNrID0gWyIwIiAqIGxlbih0X2Nhc2UpXQogICAgICAgICAgICBkZWZhdWx0X21hc2sgPSAiIi5qb2luKGRlZmF1bHRfbWFzaykKICAgICAgICAgICAgbWF4X2dhaW4gPSAtMQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBjb21iaW5hdGlvbnNfY291bnQpOgogICAgICAgICAgICAgICAgbWFzayA9IGJpbihpKVsyOl0KICAgICAgICAgICAgICAgIG1hc2sgPSBkZWZhdWx0X21hc2tbOi1sZW4obWFzayldICsgbWFzawogICAgICAgICAgICAgICAgaGVhcDEsIGhlYXAyID0gc2VsZi5nZXRfaGVhcHNfYnlfbWFzayh0X2Nhc2UsIG1hc2spCiAgICAgICAgICAgICAgICBpZiBzZWxmLmdldF9zYXNoYV9oZWFwX3N1bShoZWFwMSkgPT0gc2VsZi5nZXRfc2FzaGFfaGVhcF9zdW0oaGVhcDIpOgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2FpbiA9IG1heChzdW0oaGVhcDEpLCBzdW0oaGVhcDIpKQogICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfZ2FpbiA+IG1heF9nYWluOgogICAgICAgICAgICAgICAgICAgICAgICBtYXhfZ2FpbiA9IGN1cnJlbnRfZ2FpbgogICAgICAgICAgICBzZWxmLndyaXRlX3Jlc3VsdChtYXhfZ2FpbiwgY2FzZV9udW0pCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIENhbmR5U3RlYWxlcigpLnJ1bigp