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;
		}
		
		
	}
}
posted @ 2020-09-14 17:19  回归梦想  阅读(93)  评论(0编辑  收藏  举报