题目链接:https://vjudge.net/problem/HDU-6709
题意:一个人要抓n条鱼,每抓一条鱼用时K,每烹饪一条鱼用时a[i],抓鱼的过程不能被打断,烹饪鱼的时候可以抓鱼,也可以多烹饪一会儿,求烹饪完n条鱼所需最短时间。
思路:(学习了这位大佬的思路)https://blog.csdn.net/qq_40655981/article/details/100104985
设num=∑(a[i]/k),
该问题可以分两种情况讨论:
1.num>=(n-1),此时每烹饪一条i鱼,同时抓(a[i]/k)条鱼即可保证除去K外的每一份时间都在烹饪鱼。
2.num<(n-1),此时,需要使浪费的时间最少,则需以(k-a[i]%k)从小到大的顺序抓捕和烹饪鱼。
代码如下:
#include<cstdio> #include<algorithm> using namespace std; int t,n,k; int a[100010]; bool cmp(int x1,int x2){ return (k-x1%k)<(k-x2%k); } int main(){ int num; long long ans; scanf("%d",&t); while(t--){ num=0; scanf("%d%d",&n,&k); ans=k; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); num+=a[i]/k; ans+=a[i]; } if(num<n-1){ sort(a+1,a+1+n,cmp); num=n-num-1; for(int i=1;i<=num;i++){ ans+=(k-a[i]%k); } } printf("%lld\n",ans); } }