Exemple #1
0
        public static LibraryScanPlan GetScanPlan(int day, int allDays, List <Library> unSignedUpLibraries)
        {
            var currBestIdx   = 0;
            var currBestScore = int.MinValue;
            var daysLeft      = allDays - day;

            for (int i = 0; i < unSignedUpLibraries.Count; ++i)
            {
                var temp = EvaluateScore(unSignedUpLibraries[i], daysLeft);
                if (temp >= currBestScore)
                {
                    currBestIdx   = i;
                    currBestScore = temp;
                }
            }

            LibraryScanPlan bestPlan = new LibraryScanPlan()
            {
                Library            = unSignedUpLibraries[currBestIdx],
                FirstScanDay       = day + unSignedUpLibraries[currBestIdx].SignupProcess,
                TotalScoreProduced = currBestScore,
                BooksToScan        = new List <Book>()
            };

            return(bestPlan);
        }
Exemple #2
0
        public static LibraryScanPlan GetScanPlan(List <Book> unscannedBooks, int day, int allDays, List <Library> unSignedUpLibraries)
        {
            var allPlans = unSignedUpLibraries
                           //.OrderByDescending(l => l.TotalScore / (l.SignupProcess + (l.BooksCount / l.ShipPerDay))).Take(10)
                           .Select(library =>
            {
                var scanDays       = allDays - library.SignupProcess - day;
                var BooksToScanOld = library.Books.Intersect(unscannedBooks).Take(scanDays * library.ShipPerDay);

                return(new LibraryScanPlan()
                {
                    Library = library,
                    BooksToScanOld = BooksToScanOld,
                    TotalScoreProduced = BooksToScanOld.Sum(b => b.Score)
                });
            });

            LibraryScanPlan bestPlan = new LibraryScanPlan()
            {
                TotalScoreProduced = 0
            };

            foreach (var plan in allPlans)
            {
                if (plan.TotalScoreProduced >= bestPlan.TotalScoreProduced)
                {
                    bestPlan = plan;
                }
            }

            bestPlan.BooksToScanOld = bestPlan.BooksToScanOld.ToList();

            return(bestPlan);
        }
Exemple #3
0
        public static LibraryScanPlan GetScanPlan5(int day, int allDays, List <Library> unSignedUpLibraries)
        {
            var currBestIdx   = 0;
            var currBestScore = int.MinValue;
            var daysLeft      = allDays - day;

            for (int i = 0; i < unSignedUpLibraries.Count; ++i)
            {
                var temp = EvaluateScore5(unSignedUpLibraries[i], daysLeft);
                if (temp >= currBestScore)
                {
                    currBestIdx   = i;
                    currBestScore = temp;
                }
            }

            LibraryScanPlan bestPlan = new LibraryScanPlan()
            {
                Library            = unSignedUpLibraries[currBestIdx],
                TotalScoreProduced = currBestScore
            };

            var booksCount     = Math.Min((allDays - bestPlan.Library.SignupProcess - day) * bestPlan.Library.ShipPerDay, bestPlan.Library.Books.Count);
            var BooksToScanOld = new Book[booksCount];

            bestPlan.Library.Books.CopyTo(0, BooksToScanOld, 0, booksCount);

            bestPlan.BooksToScanOld = BooksToScanOld;

            return(bestPlan);
        }
Exemple #4
0
        public static LibraryScanPlan GetScanPlan2(List <Book> unscannedBooks, int day, int allDays, List <Library> unSignedUpLibraries)
        {
            var allPlans = unSignedUpLibraries
                           //.OrderByDescending(l => l.TotalScore / (l.SignupProcess + (l.BooksCount / l.ShipPerDay))).Take(10)
                           .Select(library =>
            {
                var scanDays            = allDays - library.SignupProcess - day;
                var BooksToScanOldCount = scanDays * library.ShipPerDay;
                var score = 0;
                foreach (var book in library.Books)
                {
                    if (unscannedBooks.Contains(book))
                    {
                        --BooksToScanOldCount;
                        score += book.Score;
                    }
                    if (BooksToScanOldCount == 0)
                    {
                        break;
                    }
                }
                // var BooksToScanOld = library.Books.Intersect(unscannedBooks).Take(scanDays * library.ShipPerDay);

                return(new LibraryScanPlan()
                {
                    Library = library,
                    TotalScoreProduced = score
                });
            });

            LibraryScanPlan bestPlan = new LibraryScanPlan()
            {
                TotalScoreProduced = 0
            };

            foreach (var plan in allPlans)
            {
                if (plan.TotalScoreProduced >= bestPlan.TotalScoreProduced)
                {
                    bestPlan = plan;
                }
            }

            bestPlan.BooksToScanOld = bestPlan.Library.Books
                                      .Intersect(unscannedBooks)
                                      .Take((allDays - bestPlan.Library.SignupProcess - day) * bestPlan.Library.ShipPerDay);

            return(bestPlan);
        }
Exemple #5
0
        public static LibraryScanPlan GetScanPlan4(int day, int allDays, List <Library> unSignedUpLibraries)
        {
            var allPlans = unSignedUpLibraries
                           //.OrderByDescending(l => l.TotalScore / (l.SignupProcess + (l.BooksCount / l.ShipPerDay))).Take(10)
                           .Select(library =>
            {
                var scanDays            = allDays - library.SignupProcess - day;
                var BooksToScanOldCount = scanDays * library.ShipPerDay;
                var score            = 0;
                var actualBooksCount = scanDays <= 0 ? 0 : Math.Min(BooksToScanOldCount, library.Books.Count);
                for (int i = 0; i < actualBooksCount; ++i)
                {
                    score += library.Books[i].Score;
                }

                return(new LibraryScanPlan()
                {
                    Library = library,
                    TotalScoreProduced = score
                });
            });

            LibraryScanPlan bestPlan = new LibraryScanPlan()
            {
                TotalScoreProduced = 0
            };

            foreach (var plan in allPlans)
            {
                if (plan.TotalScoreProduced >= bestPlan.TotalScoreProduced)
                {
                    bestPlan = plan;
                }
            }

            var booksCount     = Math.Min((allDays - bestPlan.Library.SignupProcess - day) * bestPlan.Library.ShipPerDay, bestPlan.Library.Books.Count);
            var BooksToScanOld = new Book[booksCount];

            bestPlan.Library.Books.CopyTo(0, BooksToScanOld, 0, booksCount);

            bestPlan.BooksToScanOld = BooksToScanOld;

            return(bestPlan);
        }