HDU 6709“Fishing Master”(贪心+优先级队列)

传送门

•参考资料

 2019CCPC网络选拔赛 H.Fishing Master(思维+贪心)

•题意

  池塘里有 n 条鱼,捕捉一条鱼需要花费固定的 k 时间;

  你有一个锅,每次只能煮一条鱼,其中煮熟第 i 条鱼至少需要 ti 时间;

  你在煮鱼的时候可以选择去钓一条鱼,也可也选择不钓;

  但是,一旦你决定钓鱼,就必须花费 k 时间调到一条鱼;

  任何时刻,你都可以有多条鱼待煮;

  问将所有的鱼钓上来并煮熟所有的鱼最少需要多少时间;

•题解

  理想的方案是只有在钓第一条鱼的时候锅是空的,其余任意时刻,锅都在做有用功;

  锅在做有用功指的是第 i 条鱼在锅中煮的前 ti 时间,多煮的时间称锅在做无用功;

  这种情况下,只需要且必须花费 $k+sum_{i=1}^{n}t_i$ 时间就可以将所有鱼全部钓上来并全部煮好;

  那么,实际情况并非如此,要想花费最少的时间,首先得明确在什么情况下可能会导致时间浪费;

  假设你当前煮的鱼需要花费 t 时间,钓鱼需要花费 k 时间;

  你可以在这 t 时间内钓 $frac{t}{k}$ 条鱼上来,在钓鱼的时间,锅处于煮鱼状态;

  但是剩下的 t%k 时间不足以再钓一条上来;

  此时,你就有两个决策可以选择:

    决策1:去钓下一条鱼;

    决策2:等待 t%k 时间往锅中放入下一条鱼;

  当然,选择 决策2 的前题是你得有鱼可煮;

  如果你手中有鱼的话,肯定要选择 决策2,因为等待的这 t%k 时间是必须的;

  而如果选择 决策1,那么煮当前这条鱼会花费 t+k-t%k 时间,前 t 时间锅在做有用功,是必须的;

  但是后 k-t%k 时间,锅就在做无用功,是在浪费时间;

  如果你当前手中无鱼,那么你不得不去钓鱼,那么就一定要浪费当前的 k-t%k 时间么?

  假设你现在已经煮了 i 条鱼(包括当前煮的这条鱼);

  那么,你完全可以在前 i 条鱼中找个 tj%k($j in [1,i]$)大的从而使得浪费的 k-tj%k 时间尽可能的小; 

  找 tj%k 大的就可以使用优先级队列了;

  那么,接下来就要分析一下优先钓哪条鱼了;

  当然是优先钓煮的时间较长的鱼了,因为在煮这条鱼的时候,你会尽可能多的钓上来其他的鱼,从尽可能多的选择决策2;

•代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=1e5+50;
 5 ll t[maxn];
 6 int n;
 7 ll k;
 8 
 9 int main()
10 {
11     ios::sync_with_stdio(0);
12     int T;
13     cin>>T;
14     while(T--)
15     {
16         cin>>n>>k;
17         for(int i=1;i<=n;i++)
18             cin>>t[i];
19         sort(t+1,t+1+n,greater<int>());///为了保证尽可能多钓鱼
20         ll ans=k;///钓第一条鱼时间
21         ll cnt=1;///可煮的鱼数
22         priority_queue<int> pq;
23         for(int i=1;i<=n;i++)///煮鱼
24         {
25             ans+=t[i];
26             cnt+=t[i]/k;///煮鱼时所钓的鱼
27 
28             ///已经没有可煮的鱼,需要钓鱼
29             ///由于t是从大到小排序,
30             ///当前煮鱼时已钓不到鱼,那以后也钓不到
31             ///需要额外长时间煮鱼以去钓鱼
32             if(cnt<i)
33             {
34                 ans+=k-pq.top();
35                 pq.pop();
36             }
37             pq.push(t[i]%k);///k-t[i]%k小 额外功少
38         }
39         cout<<ans<<"
";
40     }
41 }
View Code
原文地址:https://www.cnblogs.com/MMMinoz/p/11431748.html