Пример #1
0
        static void WriteResultToFile(OutputStructure outputStructure, string fileName)
        {
            Console.WriteLine($"writing result file started: {fileName}");
            using (var sw = new StreamWriter(fileName))
            {
                var sorted = outputStructure.ridesPerVehicle
                             .Select(x => x.Value)
                             .OrderBy(x => x.vehicle.vehicleNo)
                             .ToList();
                foreach (var vehicleRides in sorted)
                {
                    sw.Write($"{vehicleRides.rides.Count} ");
                    sw.WriteLine(String.Join(" ", vehicleRides.rides.Select(x => x.rideNo)));
                }
            }

            Console.WriteLine($"writing result file finished: {fileName}");
        }
Пример #2
0
        // 16 - 11237747
        // 32 - 11428838
        // 48 - 11560597
        // 64 - 11629076
        // 96 - 11639283
        // 100 - 11652814
        // 128 - 11563526
        // 158 - 11367549
        static OutputStructure Solve(InputStructure inputStructure, bool metropolisHax = false)
        {
            var os = new OutputStructure();

            var vehicles = new List <Vehicle>();

            for (int i = 0; i < inputStructure.vehiclesNo; i++)
            {
                vehicles.Add(new Vehicle()
                {
                    bonusPointsIfOnTime = inputStructure.perRideBonus, vehicleNo = i
                });
            }

            var allVehiclesAtAll = vehicles.ToList();

            var ridesLeft = inputStructure.rides.ToList();

            List <Ride> ridesForTheEnd = null;

            if (metropolisHax)
            {
                ridesLeft = ridesLeft
                            .Where(x => x.rowStart > 1600)
                            .Where(x => x.rowEnd < 4000)
                            .Where(x => x.colStart > 0)
                            .Where(x => x.colEnd < 2500)
                            .ToList();

                ridesForTheEnd = inputStructure.rides.ToList();
                ridesForTheEnd.RemoveAll(x => ridesLeft.Any(y => x.rideNo == y.rideNo));
            }

            while (ridesLeft.Count > 0 && vehicles.Count > 0)
            {
                var currVehicle    = vehicles.MinElement(x => x.availableAtTime);
                var availableRides = ridesLeft.Where(ride => currVehicle.canFulfill(ride)).ToList();

                if (availableRides.Count == 0 && ridesForTheEnd != null)
                {
                    ridesLeft.AddRange(ridesForTheEnd);
                    availableRides = ridesLeft.Where(ride => currVehicle.canFulfill(ride)).ToList();  // HAX
                    ridesForTheEnd = null;
                }

                if (currVehicle.vehicleNo < 100 && metropolisHax && ridesForTheEnd != null)
                {
                    availableRides = ridesForTheEnd.Where(ride => currVehicle.canFulfill(ride)).ToList();
                }

                if (availableRides.Count == 0)
                {
                    vehicles.Remove(currVehicle);
                    continue;
                }

                var bestRide      = availableRides.MaxElement(ride => ((double)currVehicle.pointsFor(ride)) / currVehicle.timeSpent(ride));
                var pointsForRide = currVehicle.pointsFor(bestRide);
                var timeSpent     = currVehicle.timeSpent(bestRide);

                ridesLeft.Remove(bestRide);
                if (ridesForTheEnd != null)
                {
                    ridesForTheEnd.RemoveAll(x => x.rideNo == bestRide.rideNo);
                }

                if (currVehicle.pointsFor(bestRide) == 0)
                {
                    throw new ApplicationException();
                }

                currVehicle.executeRide(bestRide);
                if (!os.ridesPerVehicle.ContainsKey(currVehicle))
                {
                    os.ridesPerVehicle.Add(currVehicle, new RidesPerVehicle()
                    {
                        vehicle = currVehicle, rides = new List <Ride>()
                    });
                }
                os.ridesPerVehicle[currVehicle].rides.Add(bestRide);
            }

            return(os);
        }