@[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; } } }