การจัดสรรจำนวนหน้าขั้นต่ำเป็นปัญหาการเขียนโปรแกรม มาพูดคุยกันถึงปัญหานี้โดยละเอียดและดูว่ามีวิธีแก้ไขอย่างไร
คำชี้แจง
คุณจะได้รับ จำนวนหน้าของหนังสือ 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