In [1]:
# The 13th dataset is the big one
fin = open ('13.in', 'r')
fout = open ('meetings.out', 'w')
inlist = [int(x) for x in fin.readline().split()]
N = inlist[0]
L = inlist[1]
print("cows, barn position")
print(N,L)
In [2]:
rightgoing = 0
leftgoing = 0
cowdata = []
totalweight = 0
left_arrival_times = []
right_arrival_times = []
for i in range(N):
inlist = [int(x) for x in fin.readline().split()]
totalweight+=inlist[0]
if inlist[2] == -1:
leftgoing+=1
left_arrival_times.append(inlist[1])
else:
rightgoing+=1
right_arrival_times.append(L-inlist[1])
cowdatum = (inlist[1],inlist[0],inlist[2])
cowdata.append(cowdatum)
In [3]:
cowdata.sort()
#print(cowdata)
print("rightgoing, leftgoing, totalweight")
print(leftgoing,rightgoing,totalweight)
left_arrival_times.sort()
right_arrival_times.sort()
#print(left_arrival_times)
#print(right_arrival_times)
In [4]:
timedata = []
for i in range(len(left_arrival_times)):
t=left_arrival_times[i]
x,w,d =cowdata[i]
timedatum=(t,w)
timedata.append(timedatum)
for i in range(len(right_arrival_times)):
t = right_arrival_times[i]
x,w,d = cowdata[len(cowdata)-1-i]
timedatum=(t,w)
timedata.append(timedatum)
timedata.sort()
#print(timedata)
In [5]:
barnweight=0
T=-1
for t,w in timedata:
barnweight+=w
#print(t,w,barnweight)
if barnweight>=(totalweight/2.0):
T=t
break
print(T)
In [6]:
%%time
# WARNING: this is very slow
# ANALYSIS MODE: datasets 1-7 pass, datasets 8-13 fail on time
meetings = 0
# cowdata: (X,W,D)
for i in range(len(cowdata)):
if(cowdata[i][2]==1):
for j in range(i+1,len(cowdata)):
if (cowdata[j][0]>cowdata[i][0]+2*T):
break
else:
if cowdata[j][2]==-1:
meetings+=1
print("meetings =",meetings)
In [ ]:
# The above code is O(N^2)
# Each rightgoing cow is moved through all other cows, and
# is compared to each leftgoing cow to see if it is within meeting distance.
# However, the code needs to be modified so that only one pass is made
# through the cowdata.