C++ 中分配最小页数
分配最小页数是一个编程问题。让我们详细讨论这个问题,看看它的解决方案是什么。
问题描述
给定 **n 本不同书籍的页数**。还有 **m 个学生** 需要分配这些书。书籍按页数升序排列。每个学生可以被分配一些连续的书。程序应该返回学生阅读页数的最大值,这个最大值应该是最小的。
让我们举个例子来更好地理解这个问题,
Input : books[] = {13 , 43, 65, 87, 92} m = 2 Output : 179
解释
在这个问题中,我们有两个学生正在读书。所以,可以在他们之间分配书籍的方式如下。
情况 1 − [13] , [43, 65, 87, 92 ]
这使得学生阅读的页数最大值为 13 / 287
情况 2 − [13, 43] , [65, 87,92]
这使得学生阅读的页数最大值为 56/ 244
情况 3 − [13, 43 , 65] , [87, 92]
这使得学生阅读的页数最大值为 121 / 179
情况 4 − [13, 43 , 65 , 87] , [92]
这使得学生阅读的页数最大值为 208 / 92
在这四种情况中,结果是 179
这个例子应该让你清楚地了解了这个问题。现在,让我们了解其背后的逻辑并为此创建一个程序。
解决这个问题的一种简单方法是使用二分查找算法。对于这种二分查找方法,将页数的最小值和最大值分别初始化为 0 和所有书籍页数的总和。然后将这些值的中间值作为中间结果,该结果将在算法继续进行时发生变化。
现在,使用中间值,我们将尝试找到找到最终解决方案的可能性。如果当前中间值有可能成为解决方案,则搜索下半部分,即最小值到中间值。如果这种情况不成立,则搜索另一半,即中间值到最大值。
此方法可用于找到此问题的解决方案,但是随着学生人数的增加,此算法往往会提供不太可靠的解决方案。
示例
#include<bits/stdc++.h> using namespace std; bool isPossible(int arr[], int n, int m, int curr_min) ; int min_pages(int arr[], int n, int m) ; int main(){ int n = 5; int books[] = {13 , 43, 65, 87, 92}; cout<<"The number of page in books are :\n"; for(int i = 0 ; i< n; i++){ cout<<books[i]<<"\t"; } int m = 2; cout<<"\nMinimum number of pages = "<<min_pages(books, n, m)<<endl; return 0; } bool isPossible(int arr[], int n, int m, int curr_min){ int studentsRequired = 1; int curr_sum = 0; for (int i = 0; i < n; i++){ if (arr[i] > curr_min) return false; if (curr_sum + arr[i] > curr_min){ studentsRequired++; curr_sum = arr[i]; if (studentsRequired > m) return false; } else curr_sum += arr[i]; } return true; } int min_pages(int arr[], int n, int m){ long long sum = 0; if (n < m) return -1; for (int i = 0; i < n; i++) sum += arr[i]; int minimum = 0, maximum = sum; int result = INT_MAX; while (minimum <= maximum){ int mid = (minimum + maximum) / 2; if (isPossible(arr, n, m, mid)){ result = min(result, mid); maximum = mid - 1; } else minimum = mid + 1; } return result; }
输出
The number of page in books are : 13 43 65 87 92 Minimum number of pages = 179
广告