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}"); }
// 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); }