在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