Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

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로 만듭니다.

이 4가지 경우 중 결과는 179번입니다.

이 예를 통해 문제가 명확해졌을 것입니다. 이제 그 이면의 논리를 이해하고 이를 위한 프로그램을 작성해 보겠습니다.

이 문제를 해결하기 위해 쉬운 접근 방식은 이진 검색 알고리즘을 사용하는 것입니다. 이 이진 검색 접근 방식의 경우 최소 및 최대 페이지 수를 모든 책의 페이지 합계와 0으로 초기화합니다. 그리고 이 값의 중간값을 중간 결과로 수정하여 알고리즘이 더 진행됨에 따라 변경됩니다.

이제 중간 값을 사용하여 최종 솔루션을 찾을 가능성을 찾으려고 합니다. 현재 mid가 해결책이 될 기회가 있다면, 하반부, 즉 최소에서 mid가 검색됩니다. 이 경우가 사실이 아니면 나머지 절반, 즉 중간에서 최대가 검색됩니다.

이 방법은 이 문제에 대한 해결책을 찾는 데 사용할 수 있지만 학생 수가 증가함에 따라 이 알고리즘은 덜 안정적인 솔루션을 제공하는 경향이 있습니다.

예시

#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