Milking Cows

We "walk" through each event in the timeline (anytime a farmer starts or stops). We determine how many farmers are active at that time, and find the duration of time that the farmers have been active or the duration of time that the farmers have been idle, updating the variables "longestActive" and "longestIdle" if the duration exceeds the current record.

def returnFirstElement(item):
    return item[0]

def returnSecondElement(item):
    return item[1]

def sortList(events):
    return sorted(sorted(events,key=returnSecondElement,reverse=True),key=returnFirstElement)

def walk(events):
    # input format: [[time,type],[time,type]...]
    print(events)
    longestActive = 0
    longestIdle = 0
    active = 0 # How many farmers are currently active
    start = events[0][0]
    for event in events:
        pActive = active
        active += event[1] # 1 = start, -1 = stop
        print(str(event[0])+' '+str(active))
        if active == 0 and pActive > 0:
            duration = event[0] - start
            if duration > longestActive:
                longestActive = duration
            start = event[0]
        if active != 0 and pActive == 0:
            duration = event[0] - start
            if duration > longestIdle:
                longestIdle = duration
            start = event[0]
    return longestActive, longestIdle

def parseInput(filename):
    with open(filename,'r') as fIn:
        lines = fIn.read().split('\n')
    lines.pop(0) # We don't need the first parameter
    lines.pop(-1) # Pop last newline
    events = []
    for i in lines:
        d = i.split(' ')
        events.append([int(d[0]),1]) # Start time
        events.append([int(d[1]),-1]) # End time
    return events    

def main():
    events = parseInput('milk2.in')
    events = sortList(events)
    res = walk(events)
    print(res)
    with open('milk2.out','w') as fOut:
        fOut.write(str(res[0])+' '+str(res[1])+'\n')

if __name__ == '__main__':
    main()