使用C++查詢完成所有工作的最低速度


在這個問題中,我們得到一個包含n個元素的陣列arr[]和一個整數h。陣列arr[]的每個元素包含該人員待處理的任務數量,而H是完成任務剩餘的時間(以小時為單位)。我們的任務是找到完成所有工作的最低速度。

問題描述:我們需要找到一個人需要在一小時內完成的任務數量,以便在H小時內完成陣列中給出的所有任務。如果他可以在不到一小時內完成所有指定的arr[i],我們將理想地等待剩餘時間,並在小時結束之後,轉到下一組任務。

讓我們舉個例子來理解這個問題:

輸入

arr[] = {4, 5, 1, 7, 8}, H = 5

輸出

8

解釋

這個人需要在5小時內完成5組任務。因此,他/她需要在一小時內完成任務數量最多的那一組,這將是他的/她的速度。

解決方案方法

為了解決這個問題,我們需要找到他可以完成所有任務的最低速度。因此,我們將找到第一個值,在這個值下,該人員可以在給定的時間內完成所有任務。

我們將在1到一次最多執行的任務數範圍內搜尋速度。由於這個值可能很大,我們將使用二分查詢來簡化計算。

為了檢查在當前速度s下,該人員能否解決問題,我們將找到完成一組任務所需的時間,然後將所有組的時間相加。如果此時間小於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

更新於:2021年3月12日

140 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.