分配最小页面数是一个编程问题。让我们详细讨论这个问题,看看可以解决什么问题。
您将得到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
在所有这4种情况中,结果为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