예제 #1
0
        public static Solution Solve(Challenge challenge)
        {
            var solution   = new Solution();
            var numDayLeft = challenge.NumberOfDays;

            foreach (var library in challenge.Libraries)
            {
                library.Score = CalculateLibraryScore(library);
            }



            foreach (var library in challenge.Libraries.OrderByDescending(x => x.Score))
            {
                if (numDayLeft <= 0)
                {
                    break;
                }

                var solutionLibrary   = new SolutionLibrary(library.Id);
                var totalShippingDays = numDayLeft - library.SignupTime;

                for (var i = 0; i < totalShippingDays * library.ScanVelocity - 1; i++)
                {
                    if (library.Books.Count > i)
                    {
                        solutionLibrary.Books.Add(library.Books[i]);
                    }
                    else
                    {
                        break;
                    }
                }

                numDayLeft -= library.SignupTime;
                if (solutionLibrary.Books.Any())
                {
                    solution.Libraries.Add(solutionLibrary);
                }
            }

            return(solution);
        }
        public static Solution Solve(Challenge challenge)
        {
            var solution   = new Solution();
            var numDayLeft = challenge.NumberOfDays;

            // Sort books
            foreach (var library in challenge.Libraries)
            {
                library.Books = library.Books.Distinct().OrderByDescending(b => b.Score).ToList();
            }

            var libraries       = challenge.Libraries;
            var sortedLibraries = new List <Library>();
            var daysLeft        = challenge.NumberOfDays;
            var seenBooks       = new List <Book>();

            while (libraries.Any())
            {
                var bestLibrary =
                    libraries.OrderBy(library => library.SignupTime)
                    .ThenByDescending(library => ScoreLibrary(library, daysLeft))
                    .FirstOrDefault();

                sortedLibraries.Add(bestLibrary);
                daysLeft -= bestLibrary.SignupTime;
                libraries.Remove(bestLibrary);
            }
            //
            // var sortedLibraries =
            //     challenge.Libraries
            //         .OrderBy(library => library.SignupTime)
            //         // .ThenByDescending(library => library.ScanVelocity)
            //         .ThenByDescending(library => ScoreLibrary(library, challenge.NumberOfDays)).ToList();
            var seenBook = new List <Book>();

            foreach (var library in sortedLibraries)
            {
                if (numDayLeft <= 0)
                {
                    break;
                }

                var solutionLibrary   = new SolutionLibrary(library.Id);
                var totalShippingDays = numDayLeft - library.SignupTime;

                for (var i = 0; i < totalShippingDays * library.ScanVelocity - 1; i++)
                {
                    if (library.Books.Count > i)
                    {
                        var uniqueBooks = library.Books.Except(seenBook).ToList();
                        if (uniqueBooks.Any())
                        {
                            solutionLibrary.Books.Add(uniqueBooks.First());
                            seenBook.Add(uniqueBooks.First());
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                numDayLeft -= library.SignupTime;

                if (solutionLibrary.Books.Any())
                {
                    solution.Libraries.Add(solutionLibrary);
                }
            }

            return(solution);
        }