首先假设我能够在炖鱼的时候把所有的鱼抓完,那么最少只需要
k
+
∑
i
=
1
n
t
[
i
]
k+\sum_{i=1}^{n}t[i]
k+∑i=1nt[i]的时间就可以完成。
现在注意到可能在炖鱼的时候无法抓完所有的鱼,也就是
∑
i
=
1
n
t
[
i
]
k
≤
n
−
1
\sum_{i=1}^{n}\frac{t[i]}{k}\leq n-1
∑i=1nkt[i]≤n−1的情形,对于剩下来的一部分鱼,我可以在炖鱼的时候选择一段补全多抓一条鱼,这个时间是
k
−
t
[
i
]
%
k
k-t[i]\%k
k−t[i]%k,对
t
[
i
]
%
k
t[i]\%k
t[i]%k从大到小排序,加上我剩下的鱼需要的时间即为答案。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=1e5+7;
int a[N];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
ll ans=k,ok=0;
for(int i=1;i<=n;i++)
ok+=a[i]/k;
if(ok>=n-1) {
for(int i=1;i<=n;i++)
ans+=a[i];
printf("%lld\n",ans);
}
else {
for(int i=1;i<=n;i++)
ans+=a[i],a[i]%=k;
sort(a+1,a+1+n,greater<int>());
for(int i=1;i<=n-1-ok;i++)
ans+=k-a[i];
printf("%lld\n",ans);
}
}
return 0;
}