public override void Solve()
        {
            Rides.Sort(new Ride.CompareByStartTime());
            Rides.Reverse();
            Vehicle.CompareByTimeDriveEnd carSortTimeDriveEnd = new Vehicle.CompareByTimeDriveEnd();
            Vehicles.Sort(carSortTimeDriveEnd);
            int currentTime = -1;

            while (Rides.Count > 0)
            {
                currentTime++;
                if (Vehicles[0].TimeDriveEnd > currentTime)
                {
                    currentTime = Vehicles[0].TimeDriveEnd;
                }

                if (currentTime >= this.Steps)
                {
                    break;
                }

                for (int ridePos = Rides.Count - 1; ridePos >= 0; ridePos--)
                {
                    Ride ride = Rides[ridePos];

                    // When too far in list
                    if (ride.TimeStart > currentTime)
                    {
                        break;
                    }

                    // If ride not possible
                    if (ride.TimeLatestStart < currentTime)
                    {
                        Rides.RemoveAt(ridePos);
                        continue;
                    }

                    Vehicle bestCar;
                    int     bestStartTime;
                    FindBestCarForRideMaxTime(ride, currentTime, out bestCar, out bestStartTime);

                    if (bestCar == null)
                    {
                        continue;
                    }

                    // Check if valid
                    // Complete ride on time
                    int rideStartTime = Math.Max(ride.TimeStart, bestStartTime);
                    if (rideStartTime + ride.Distance >= ride.TimeEnd)
                    {
                        continue;
                    }

                    if (rideStartTime + ride.Distance >= Steps)
                    {
                        continue;
                    }

                    // Add ride to car
                    bestCar.AddRide(ride, ride.EndR, ride.EndC, rideStartTime + ride.Distance);
                    Rides.RemoveAt(ridePos);

                    // Optimization - if not vehicle is free at this time - not need to continue checking
                    Vehicles.Sort(carSortTimeDriveEnd);
                    if (Vehicles[0].TimeDriveEnd > currentTime)
                    {
                        break;
                    }
                }
            }
        }
        public override void Solve()
        {
            Rides.Sort(new Ride.CompareByStartTime());
            Rides.Reverse();
            Vehicle.CompareByTimeDriveEnd carSortTimeDriveEnd = new Vehicle.CompareByTimeDriveEnd();
            Vehicles.Sort(carSortTimeDriveEnd);
            int currentTime = -1;

            while (Rides.Count > 0)
            {
                Vehicles.Sort(carSortTimeDriveEnd);

                currentTime++;
                if (Vehicles[0].TimeDriveEnd > currentTime)
                {
                    currentTime = Vehicles[0].TimeDriveEnd;
                }

                if (currentTime >= this.Steps)
                {
                    break;
                }

                // Clean rides list
                for (int ridePos = Rides.Count - 1; ridePos >= 0; ridePos--)
                {
                    Ride ride = Rides[ridePos];

                    // If ride not possible
                    if (ride.TimeLatestStart < currentTime)
                    {
                        Rides.RemoveAt(ridePos);
                        continue;
                    }
                }

                for (int i = 0; i < Vehicles.Count; i++)
                {
                    Vehicle car = Vehicles[i];

                    // This car (and all after) can't do rides in time
                    if (car.TimeDriveEnd > currentTime)
                    {
                        break;
                    }

                    Ride bestRide;
                    int  bestStartTime;
                    FindBestRideForCarMaxTime(car, currentTime, out bestRide, out bestStartTime);

                    if (bestRide == null)
                    {
                        continue;
                    }

                    // Check if valid
                    // Complete ride on time
                    int rideStartTime = Math.Max(bestRide.TimeStart, bestStartTime);
                    if (rideStartTime + bestRide.Distance >= bestRide.TimeEnd)
                    {
                        continue;
                    }

                    if (rideStartTime + bestRide.Distance >= Steps)
                    {
                        continue;
                    }

                    // Add ride to car
                    car.AddRide(bestRide, bestRide.EndR, bestRide.EndC, rideStartTime + bestRide.Distance);
                    Rides.Remove(bestRide);
                }
            }
        }