2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master
题意:
你在钓鱼,每次钓鱼固定时间为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;
}
}
}