-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadvanced_findbest_maxscore.py
68 lines (68 loc) · 2.16 KB
/
advanced_findbest_maxscore.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import sys
from operator import itemgetter
def distance(a,b):
return abs(a[0]-b[0])+abs(a[1]-b[1])
def output(cars):
with open('advanced_bestscoremax_{}.txt'.format(infile),'w') as write_file:
for car in cars:
write_file.write('{} '.format(len(car)))
for r in car:
write_file.write('{} '.format(r))
write_file.write('\n')
infile = sys.argv[1]
info = {}
rides = []
with open(infile,'r') as input_file:
for line_num,line in enumerate(input_file):
if line_num == 0:
linesp = line.split()
info['ro'] = int(linesp[0])
info['co'] = int(linesp[1])
info['ve'] = int(linesp[2])
info['rides'] = int(linesp[3])
info['bo'] = int(linesp[4])
info['steps'] = int(linesp[5])
else:
inf_list=map(int,line.replace('\n','').split())
inf_list.append(line_num-1)
rides.append(inf_list)
sorted_rides = sorted(rides, key=itemgetter(5))
cars = []
cars_info = []
cars_list = []
for car in range(info['ve']):
cars.append([])
cars_info.append({'car':car,'pos':(0,0),'avail':0})
for this_step in range(info['steps']):
if this_step%10000 == 0:
print '{}/{}'.format(this_step,info['steps'])
for car in cars_info:
if car['avail'] <= this_step:
remove_index = None
best_ride = -1
best_step = float('inf')
best_pos = (-1,-1)
max_score = float('-inf')
for ride_index,ride in enumerate(sorted_rides):
pre_score = distance((ride[2],ride[3]),(ride[0],ride[1]))
starting_step = max(ride[4],this_step+distance(car['pos'],(ride[0],ride[1])))
expected_step = starting_step + pre_score
expected_score = pre_score - (ride[5] + starting_step)
if expected_step < ride[5] and ride[5] > this_step:
if expected_score > max_score:
best_ride = ride[-1]
best_step = expected_step
best_pos = (ride[2],ride[3])
remove_index = ride_index
max_score = expected_score
elif expected_score == max_score and expected_step < best_step:
best_ride = ride[-1]
best_step = expected_step
best_pos = (ride[2],ride[3])
remove_index = ride_index
if remove_index is not None:
del sorted_rides[remove_index]
cars[car['car']].append(best_ride)
car['avail'] = best_step
car['pos'] = best_pos
output(cars)