Я хотел бы получить помощь в понимании того, почему мое решение для проблемы 3 в Google CodeJam 2020 Qualifier не работает.
Ссылка на проблему: https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/000000000020bdf9
Мое решение:
Обзор высокого уровня:
- принять ввод
- выяснить, невозможен ли данный ввод, отсортировав по времени начала, а затем проверив, активны ли одновременно более 2 последовательных действий (что невозможно)
- , если это так, выводить соответственно; если это не так, продолжайте процедуру ниже
- произвольно назначить первое лицо: в моем решении я выбираю Кэмерон (C).
- далее, так как мы знаем, что решение существует и массив, который я перебираю, сортируется по времени начала, если следующий интервал активности (хронологически) перекрывается по продолжительности с текущим, назначьте его человеку, который в данный момент не занят. Это просто потому, что решение существует, и оно явно не может быть текущим человеком, поэтому оно должно быть другим.
- более того, если следующий интервал активности (хронологически) не перекрывается с текущей активностью, то назначьте его человеку, который в настоящее время занят (потому что он не будет занят для следующего действия)
- , кроме того, цитата прямо из официального анализа проблемы: «Если назначение возможно, не может быть никакого набора из трех видов деятельности, которые попарно перекрываются, поэтому, в отличие от предыдущего аргумента, мы сможем назначить действие по крайней мере одному из Jam ie или Cameron на каждом шаге. "
На данный момент я считаю, что этих аргументов достаточно, чтобы показать, что мой лог c действителен, хотя мой код, очевидно, не всегда дает правильный ответ. Я был бы очень признателен за любую помощь в этом, так как я потратил часы, пытаясь отладить, без причины или найти контрпример к моему коду безрезультатно. Я включил свой код, для справки, ниже.
Код:
for p in range(int(input())):
s = int(input())
l = []
for i in range(s):
l.append(list(map(int, list(input().split()))))
unsort = l.copy()
l = sorted(l, key=lambda tup: (tup[0],tup[1]))
enumerated = list(enumerate(unsort))
enumerated.sort(key=lambda x: x[1][0])
impossible = False
endings = sorted([(x[1], False) for x in unsort])
startings = sorted([(x[0], True) for x in unsort])
total = sorted(endings + startings, key=lambda tup: (tup[0], tup[1]))
size = 0
for i in total:
if i[1] == True:
size += 1
else:
size -= 1
if size > 2:
impossible = True
def overlap(a,b):
if not max(a[0], b[0]) >= min(a[1], b[1]):
return True
else:
return False
ans = "C"
def opp(a):
if a == "C":
return "J"
else:
return "C"
if impossible == True:
print("Case #" + str(p+1) + ": " + "IMPOSSIBLE")
else:
for i in range(0, s-1):
if overlap(l[i], l[i+1]) == True:
ans = ans + opp(ans[len(ans)-1])
else:
ans = ans + opp(opp(ans[len(ans)-1]))
#the stuff below is to order the activity assignments according to input order
key_value = [(ans[i], l[i]) for i in range(s)]
fans = ""
for i in range(s):
for j in range(s):
if enumerated[j][0] == i:
fans = fans + key_value[j][0]
print("Case #" + str(p + 1) + ": " + fans)