ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ที่ประกอบด้วย n องค์ประกอบและจำนวนเต็ม h แต่ละองค์ประกอบของอาร์เรย์ arr[] มีจำนวนงานที่รอดำเนินการสำหรับบุคคลนั้นและ H คือเวลาที่เหลือในการทำงานให้เสร็จ (เป็นชั่วโมง) งานของเราคือค้นหาความเร็วขั้นต่ำเพื่อจบงานทั้งหมด
คำอธิบายปัญหา :เราจำเป็นต้องค้นหาจำนวนงานที่บุคคลต้องทำให้เสร็จในหนึ่งชั่วโมงเพื่อให้งานทั้งหมดที่ระบุในอาร์เรย์เสร็จสมบูรณ์ในชั่วโมง H ถ้าเขาสามารถทำงานทั้งหมดที่ระบุใน arr[i] ได้ภายในเวลาไม่ถึงชั่วโมง เราจะนั่งพักผ่อนตามอัธยาศัย และหลังจากสิ้นสุดชั่วโมง ย้ายไปที่งานชุดถัดไป
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {4, 5, 1, 7, 8}, H = 5
ผลลัพธ์
8
คำอธิบาย
บุคคลนั้นต้องทำงานให้เสร็จ 5 ชุดใน 5 ชั่วโมง ดังนั้น เขา/เธอจึงต้องสร้างชุดที่มีจำนวนงานสูงสุดใน 1 ชั่วโมง ซึ่งจะเป็นความเร็วของเขา/เธอ
แนวทางการแก้ปัญหา
เพื่อแก้ปัญหานี้ เราต้องหาความเร็วขั้นต่ำที่เขาสามารถทำงานทั้งหมดได้ ดังนั้น เราจะพบค่าแรกที่บุคคลสามารถทำได้ทั้งหมดคือระยะเวลาที่กำหนด
เราจะค้นหาความเร็วภายในช่วง 1 ถึงจำนวนสูงสุด ของงานที่ต้องทำในครั้งเดียว เนื่องจากค่านี้อาจมีขนาดใหญ่ เราจะใช้การค้นหาแบบไบนารีเพื่อความสะดวกในการคำนวณ
ในการตรวจสอบว่าด้วยความเร็วปัจจุบัน บุคคลสามารถแก้ปัญหาได้หรือไม่ เราจะหาเวลาที่ใช้ในการทำให้ครบชุดหนึ่งแล้วจึงบวกเวลาสำหรับชุดทั้งหมด หากเวลานี้น้อยกว่า H ก็ไม่สามารถทำได้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; bool canDoJobInTime(int A[], int n, int H, int speed) { int timeTaken = 0; for (int i = 0; i < n; ++i) timeTaken += (A[i] - 1) / speed + 1; return timeTaken <= H; } int calcJobMinSpeed(int A[], int n, int H) { if (H < n) return -1; int maxJob = A[0]; for(int i = 1; i < n; i++) maxJob = max(A[i], maxJob); int start = 1, end = maxJob; while (start < end) { int mi = start + (end - start) / 2; if (!canDoJobInTime(A, n, H, mi)) start = mi + 1; else end = mi; } return start; } int main() { int A[] = { 3, 6, 7, 11 }, H = 8; int n = sizeof(A) / sizeof(A[0]); cout<<"The minimum speed to finish all jobs in time is "<<calcJobMinSpeed(A, n, H); return 0; }
ผลลัพธ์
The minimum speed to finish all jobs in time is 4