@[toc]

题意:

你在钓鱼,每次钓鱼固定时间为k(必定钓上一条鱼),池塘一共n条鱼,钓上鱼后要煮,每条鱼煮的时间不相同,可以在煮鱼的同时钓鱼,问钓上所有的鱼并煮完需要最短的时间是多少?

题解:

每条鱼必被煮,所以煮鱼时间固定,我们要求的就是钓鱼时间。
总时间=第一次钓鱼时间+煮鱼时间+额外的钓鱼时间
为什么是额外的?因为我们可以在煮鱼的时候钓鱼,相当于两者抵消了一部分,煮鱼时间要%k,表示抵消后的煮鱼时间
额外的钓鱼时间=捕鱼固定时间 - 处理过后的钓鱼时间
要让额外时间越少,我们就要使得处理过后的钓鱼时间越长
我们可以排序从大到小,先处理大的数据

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+9;
typedef long long ll;
ll t[maxn];
bool cmp(ll a,ll b)
{
    return a>b;
}
int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    ll n,k;
    while(T--)
    {    
    //    ll tot=0,num=0;
        memset(t,0,sizeof(t));

        cin>>n>>k;//k是钓鱼时间 
        ll tot=k,num=1;
        for(int i=1;i<=n;i++)
        {
            cin>>t[i];
            tot+=t[i];//加上固定的煮鱼时间 
            num+=t[i]/k;//捕鱼数量 
            t[i]%=k;//额外的煮鱼时间 
        }
        if(num>=n)cout<<tot<<endl;
        else
        {
            sort(t+1,t+1+n,cmp);//从小到大排序 
            for(int i=1;num<n;num++,i++)//当捕鱼数量足够时,捕鱼时间结束 
            {
                tot+=(k-t[i]);//加上等待的时间 
            }
            cout<<tot<<endl;
        }


    }
}