感谢两位大佬的博客:
题解:
首先第一条鱼是要在煮鱼之前要钓的。
如果煮鱼期间我们可以钓到这么多鱼,如果不小于n - 1,那么就不会浪费时间,否则少的鱼数就需要我们再花费时间去抓。
我们对每一个从大到小排序,少几条就加上几条浪费的时间
代码如下
void solve()
{
LL n, k; scanf("%lld%lld", &n, &k);
LL ans = k, cnt = 0;
for (int i = 0; i < n; i ++ )
{
LL t; scanf("%lld", &t);
ans += t;
a[i] = t % k, cnt += t / k;
}
if (cnt >= n - 1)
{
printf("%lld\n", ans);
return;
}
sort(a, a + n, greater<int>());
for (int i = 0; i < n - 1 - cnt; i ++ )
ans += k - a[i];
printf("%lld\n", ans);
}
优先队列的做法: 煮鱼花费时间最长的肯定先煮,这样抓到的额外的鱼才能尽可能的多
void solve()
{
LL n, k; scanf("%lld%lld", &n, &k);
LL ans = k, cnt = 1;
for (int i = 1; i <= n; i ++ ) scanf("%lld", &t[i]);
sort(t + 1, t + 1 + n, greater<int> ());
priority_queue<int> heap;
for (int i = 1; i <= n; i ++ )//煮n条鱼
{
ans += t[i]; //将煮每条鱼所用时间加到答案里
cnt += t[i] / k;//煮第i条鱼期间可以抓到的鱼
if (cnt < i) //如果第i条鱼没有抓到,就要在之前浪费时间抓鱼
{
ans += k - heap.top();//选择t % k最大的那条鱼后钓第i条鱼
heap.pop();
}
heap.push(t[i] % k);
}
printf("%lld\n", ans);
}