Я попробовал свои силы в этой Google Codejam Africa (конкурс уже завершен, я только что сделал это, чтобы улучшить свои навыки программирования).
Проблема:
Вы устраиваете вечеринку с гостями G
и обратите внимание, что есть нечетное число
гостей! При планировании вечеринки вы
намеренно приглашены только пары и
дал каждой паре уникальный номер C на
их приглашение. Вы хотели бы
выделить кого бы то ни было
просить всех гостей за их
пригласительные номера.
Вход:
Первая строка ввода дает количество случаев, N.
N тестовых случаев. Для каждого теста будет:
- Одна строка, содержащая значение G the
число гостей.
- Одна строка, содержащая
разделенный пробелами список G целых чисел.
Каждое целое число C обозначает
пригласительный код гостя. Выход
Для каждого теста выведите одну строку
содержащий "Case #x:", сопровождаемый
число C гостя, который один.
Пределы:
Маленький набор данных
3 ≤ G <100 </p>
Большой набор данных
3 ≤ G <1000 </p>
Пример ввода:
3
3
1 2147483647 2147483647
5
3 4 7 4 3
5
2 10 2 10 5
Пример вывода:
Case #1: 1
Case #2: 7
Case #3: 5
Вот решение, которое я придумал:
with open('A-large-practice.in') as f:
lines = f.readlines()
with open('A-large-practice.out', 'w') as output:
N = int(lines[0])
for testcase, i in enumerate(range(1,2*N,2)):
G = int(lines[i])
for guest in range(G):
codes = map(int, lines[i+1].split(' '))
alone = (c for c in codes if codes.count(c)==1)
output.write("Case #%d: %d\n" % (testcase+1, alone.next()))
Он запускается на моей машине за 12 секунд с большим вводом .
Теперь мой вопрос: можно ли улучшить это решение в Python, чтобы оно работало в более короткие сроки или использовало меньше памяти? анализ проблемы дает некоторые указания о том, как сделать это в Java и C ++, но я не могу перевести эти решения обратно в Python.
Edit:
Включая советы Алекса Мартелли и IVlad ниже, у меня теперь есть это решение, которое работает в 0.079s:
with open('A-large-practice.in') as f:
lines = f.readlines()
with open('A-large-practice.out', 'w') as output:
N = int(lines[0])
for testcase, i in enumerate(range(1,2*N,2)):
codes = map(int, lines[i+1].split(' '))
alone = 0
for c in codes: alone ^= c
output.write("Case #%d: %d" % (testcase+1, alone))