一道好题
P8170
我们可以贪心的想,想让最后的高度最大的最小,我们可以先把所有树的最终高度处理出来,贪心的每次砍最高的。
考虑简化这个过程,我们将最终高度\(f\)降序排序,同时维护一个队列\(a\),表示当前在处理的树。
根据贪心策略,这个队列的队头需要保持最大,队尾最小。
我们每次把队列中剩余高度可以砍的树砍一次,如果操作完后没入队的树高度大于队尾,则暴力冒泡将新的树压进队列中并保持单调性,在这个过程中,我们顺便维护出砍树过程的序列,记录每次砍的树的编号,同时维护出每棵树要砍的次数。
接下来我们考虑维护每棵树每次砍的天数,根据我们维护出的每棵树要砍的总次数,模拟每棵树生长的过程,一旦满足高度\(>x\),就砍一刀,并把砍的天数记录下来(注意:一天可以砍多刀)。
现在我们知道了每棵树砍的具体天数与砍树的序列,遍历一遍砍树的操作序列,同时维护每天剩余的砍树次数(初始每天为\(k\)),假设当前遍历到的树为\(i\),砍到第\(p\)次,根据之前处理出来的每棵树的具体天数,我们可以知道当前是第几天,在砍完这一次后,相应天数的剩余次数-1,注意:如果当前天数的剩余天数为0,则代表当前天数不能再砍树了,这是需要把当前天数剩余的树合并到下一天,可以用并查集维护。
最后我们知道了每棵树正确的操作次数,遍历每棵树取最大值即可。

浙公网安备 33010602011771号