Почему мое решение проблемы 3 Квалификационного раунда CodeJam 2020 не работает? - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы получить помощь в понимании того, почему мое решение для проблемы 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...