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 }

 

posted @ 2019-08-24 09:15  IAT14  阅读(152)  评论(0编辑  收藏  举报