题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6709
题意:有n条鱼在河里,需要先把鱼捉上来才能炖鱼,问炖完所有鱼最少需要多少时间
每k分钟只能捉一条鱼,顺序任意,每条鱼炖熟的时间ti 由于锅很小,每次只能炖一条鱼,你可以先捉一条鱼上来,把他炖上,然后再捉别的鱼
思路:因为要求最少时间,所以需要捉鱼和炖鱼同时进行才会让时间利用率最大化,所以先求出炖鱼时能捉几条鱼,把不够k的存入优先队列,如果炖鱼的时候没有钓到足够的鱼,那么就不断从优先队列里取top元素来占用一个k的时间 ,最后把队列里的鱼炖完就OK了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 10;
priority_queue<int> q;
int main()
{
int T, n, k, x;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &k);
ll ans = k;
for(int i = 0; i < n; i++) {
scanf("%d", &x);
ans += x / k * k;
q.push(x % k);
}
int temp = ans / k;
while(temp < q.size()) {
ans += k;
q.pop();
}
while(!q.empty()) {
ans += q.top();
q.pop();
}
printf("%I64d\n", ans);
}
return 0;
}