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

更新于: 2019-10-16

382 次浏览

开启你的 职业生涯

完成课程获得认证

开始学习
广告