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