题意:m个工人,n个建筑,每一个建筑需要ti时间建造,并且消耗一个工人,每一个工人可以在k时间后分裂成两个工人,输出建造n个建筑需要的最小时间。
思路:总共需要n-m个工人,所以需要n-m次分裂,分裂出来的两个工人其中一个去做耗费时间最长的建筑,另一个继续分裂,直到n-m次分裂之后。具体写法和构造哈夫曼树一样。
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int main(void){
int t;
scanf("%d",&t);
while(t--){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
priority_queue<int,vector<int>,greater<int> > pq;
int x;
for(int i = 1; i <= n; i++){
scanf("%d",&x);
pq.push(x);
}
int num = n - m;
while(num > 0){
pq.pop();
pq.push(pq.top() + k);
pq.pop();
num--;
}
while(pq.size() != 1){
pq.pop();
}
printf("%d\n",pq.top());
}
return 0;
}