Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จัดสรรจำนวนหน้าขั้นต่ำใน C++


การจัดสรรจำนวนหน้าขั้นต่ำเป็นปัญหาการเขียนโปรแกรม มาพูดคุยกันถึงปัญหานี้โดยละเอียดและดูว่ามีวิธีแก้ไขอย่างไร

คำชี้แจง

คุณจะได้รับ จำนวนหน้าของหนังสือ n เล่มที่แตกต่างกัน . นอกจากนี้ยังมี นักเรียนจำนวนหนึ่ง ที่จะมอบหมายหนังสือให้ หนังสือเรียงจากน้อยไปมากของจำนวนหน้า และนักเรียนทุกคนสามารถได้รับหนังสือบางเล่มติดต่อกันได้ โปรแกรมควรส่งคืนจำนวนหน้าที่อ่านสูงสุดโดยนักเรียนซึ่งควรเป็นขั้นต่ำ

ลองมาดูตัวอย่างเพื่อทำความเข้าใจปัญหานี้ให้ดีขึ้น

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