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()