hdu 6709 Fishing Master 贪心
感觉题意没说清楚,人手中可以存放多条鱼等着烤。
假设每条鱼烤熟需要的时间都很长,那么我们就开始钓一条鱼,然后这面烤着鱼,钓一条鱼,等着这条烤好,以此循环。那么总时间就是k + Σt[i]。
但是实际上可能会有一些鱼烤的特别快,这面鱼都烤好了,我那面还没钓上来新的鱼,导致炉子时间就浪费了。
我们考虑对于一条鱼i,在它烧烤的过程中,我们能钓t[i] / k的鱼。
如果Σt[i]/k >= n - 1,那么我们就可以以一种合理的方法安排钓鱼的顺序,从而使得炉子时间不浪费。总时间就是k + ∑t[i]。
如果Σt[i]/k < n - 1,那么我们就不可避免地要浪费一些炉子时间。对于一条鱼i烧烤过程中,我们可以浪费k - t[i]%k的炉子时间,来额外钓一条鱼。
我们看一下Σt[i] / k 和n - 1差距多少条鱼,选择较小的k - t[i] % k 来弥补即可。
记得开 long long
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 int T,n,k,cnt; 6 ll tim; 7 int t[100100],lst[100100]; 8 int main() 9 { 10 for (scanf("%d",&T);T != 0;T--) 11 { 12 scanf("%d%d",&n,&k); 13 tim = k; 14 cnt = 0; 15 for (int i = 1;i <= n;i++) 16 scanf("%d",&t[i]); 17 for (int i = 1;i <= n;i++) 18 { 19 tim += t[i]; 20 cnt += t[i] / k; 21 lst[i] = k - t[i] % k; 22 } 23 if (cnt < n - 1) 24 { 25 sort(lst + 1,lst + n + 1); 26 for (int i = 1;i <= n - 1 - cnt;i++) 27 tim += lst[i]; 28 } 29 printf("%lld\n",tim); 30 } 31 return 0; 32 }
心之所动 且就随缘去吧