|
@@ -132,19 +132,33 @@ func max(a, b int) int {
|
132
|
132
|
}
|
133
|
133
|
}
|
134
|
134
|
|
|
135
|
+func (c *Car) CanPick(r *Ride) bool {
|
|
136
|
+ return !r.used && r.f >= c.EarliestFinish(r)
|
|
137
|
+}
|
|
138
|
+
|
|
139
|
+func (c *Car) pickClosestLate() *Ride {
|
|
140
|
+ var best *Ride
|
|
141
|
+ var dbest = 999999999
|
|
142
|
+ for _, r := range Rides {
|
|
143
|
+ if !c.CanPick(r) {
|
|
144
|
+ continue
|
|
145
|
+ }
|
|
146
|
+ d := c.distanceTo(r.a, r.b)
|
|
147
|
+ if d < dbest && d > r.s-c.Arrival {
|
|
148
|
+ best = r
|
|
149
|
+ dbest = d
|
|
150
|
+ }
|
|
151
|
+ }
|
|
152
|
+ return best
|
|
153
|
+}
|
|
154
|
+
|
135
|
155
|
func Choose(c *Car) *Ride {
|
136
|
156
|
var bestRide *Ride
|
137
|
157
|
bestLenOfRide := 0
|
138
|
158
|
bestTotal := 0
|
139
|
159
|
// fmt.Printf("car %d\n", c.ID)
|
140
|
160
|
for _, r := range Rides {
|
141
|
|
- if r.used {
|
142
|
|
- continue
|
143
|
|
- }
|
144
|
|
- if r.Length() > 6000 {
|
145
|
|
- continue
|
146
|
|
- }
|
147
|
|
- if r.f < c.EarliestFinish(r) {
|
|
161
|
+ if !c.CanPick(r) {
|
148
|
162
|
continue
|
149
|
163
|
}
|
150
|
164
|
// fmt.Printf("%d %d -> %d %d\n", r.a, r.b, r.x, r.y)
|
|
@@ -160,6 +174,12 @@ func Choose(c *Car) *Ride {
|
160
|
174
|
// if bestRide != nil {
|
161
|
175
|
// fmt.Printf("Picking %d %d -> %d %d\n", bestRide.a, bestRide.b, bestRide.x, bestRide.y)
|
162
|
176
|
// }
|
|
177
|
+ if bestRide != nil {
|
|
178
|
+ r := c.pickClosestLate()
|
|
179
|
+ if r != nil {
|
|
180
|
+ bestRide = r
|
|
181
|
+ }
|
|
182
|
+ }
|
163
|
183
|
return bestRide
|
164
|
184
|
}
|
165
|
185
|
|