Hi! I've just started to do some of the old code jam problems and came 
across "Parenting Partnering Returns" from the 2020 Qualification Round. I 
solved it in a kind of unique way which I believe is O(n), at least 
specifically for this problem. It definitely will be slower than O(nlogn) 
solutions until n gets pretty massive, but I thought I'd share and ask if 
anyone can spot if/why this isn't O(n) for this very specific set of 
problem constraints.

<CODE>
import sys

def print_output(case_number, delimiter, *args):
    args_joined = delimiter.join(args)
    print("Case #" + str(case_number) + ": " + args_joined)

class Activity:
    def __init__(self, ordinal, start, finish):
        self.ordinal = ordinal
        self.start = start
        self.finish = finish
        self.assigned_parent_schedule = None

    def __repr__(self):
        return str(self.ordinal) + ": " + str(self.start) + "  " + 
str(self.finish)

class ParentSchedule:
    def __init__(self, parent_letter):
        self.parent_letter = parent_letter
        self.minutes_occupied = [False for i in range(0, 1440)]

    def is_available_for_activity(self, activity):
        for minute in range(activity.start, activity.finish):
            if self.minutes_occupied[minute]:
                return False
        return True

    def schedule_activity(self, activity):
        for minute in range(activity.start, activity.finish):
            self.minutes_occupied[minute] = True
        activity.assigned_parent_schedule = self

def find_available_schedule(activity, parent_schedules):
    for parent_schedule in parent_schedules:
        if parent_schedule.is_available_for_activity(activity):
            return parent_schedule
    return None

def custom_sort_by_start(activities):
    minute_to_activity = [list() for x in list(range(0, 1440))]
    for activity in activities:
        minute_to_activity[activity.start].append(activity)

    toReturn = list()
    for i in range(0, len(minute_to_activity)):
        for a in minute_to_activity[i]:
            toReturn.append(a)

    return toReturn

number_of_cases = int(sys.stdin.readline())

for case_number in range(1, number_of_cases + 1):
    parent_schedules = [ParentSchedule('C'), ParentSchedule('J')]
    impossible = False
    lines_in_case = int(sys.stdin.readline())
    activities = []
    for i in range(0, lines_in_case):
        case_line_split = sys.stdin.readline().split()
        activity = Activity(i, int(case_line_split[0]), int(case_line_split[1]))
        activities.append(activity)

    activities_sorted_by_start = custom_sort_by_start(activities)

    for activity in activities_sorted_by_start:
        available_parent_schedule = find_available_schedule(activity, 
parent_schedules)
        if available_parent_schedule == None:
            impossible = True
        else:
            available_parent_schedule.schedule_activity(activity)            
    
    if impossible:
        print_output(case_number, '', 'IMPOSSIBLE')
    else:
        print_output(case_number, '', 
*[a.assigned_parent_schedule.parent_letter for a in activities])

</CODE>

Thanks,
Mike

-- 
You received this message because you are subscribed to the Google Groups 
"Google Code Jam" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-code/a3e82c9a-472a-4968-b4c8-6f3e8165b0a9n%40googlegroups.com.

Reply via email to