在C ++中构建模块的最短时间

假设我们有一个块列表,如果我们有blocks [i] = t,这意味着第i个块需要t单位时间来构建。一个街区只能由一个工人建造。单身工人可以分成两个工人,也可以建一个街区然后回家。这两个决定需要一些时间。将一个工人拆分为两个工人的时间成本称为“拆分”。

因此,如果输入像是blocks [[1,2],并且split = 5,那么输出将是7,因为我们可以将worker分成5个时间单位的2个worker,然后将每个worker分配给一个block,因此成本是5 +最大值1和2 = 7。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个优先级队列pq

  • 对于初始化i:= 0,当i <块大小时,更新(将i增加1),执行-

    • 将块[i]插入pq

  • 当pq> 1的大小时-

    • 从pq中删除元素

    • x:= pq的顶部元素

    • 从pq中删除元素

    • 将split + x插入pq

  • 返回pq的top元素

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int minBuildTime(vector<int>& blocks, int split) {
      priority_queue<int, vector<int>, greater<int> > pq;
      for (int i = 0; i < blocks.size(); i++)
      pq.push(blocks[i]);
      while (pq.size() > 1) {
         pq.pop();
         int x = pq.top();
         pq.pop();
         pq.push(split + x);
      }
      return pq.top();
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2};
   cout << (ob.minBuildTime(v, 5));
}

输入值

{1,2}, 5

输出结果

7