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

ค้นหาความเร็วขั้นต่ำเพื่อจบงานทั้งหมดใน C++


ในปัญหานี้ เราได้รับอาร์เรย์ 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