Skip to main content

2742

  1. 一定要用paid painter才可以用free的,假设我们在时间time上,这意味着我们用了paid,在这段时间里我们可以刷其他墙.
  2. 因为免费的刷墙只用1 unit时间,这意味着time >= n一定能刷完所有墙,而我们的目的则是在能刷完的时间内找到最小的cost 然后我就完全没有思路了

题解后

看了题解但觉得自己还是无法自己独立做出来这道题,问题事知道要用time做体积但是无法正确推理,思考问题没有关联性。例如我已经知道了time做体积且(free刷1墙只需1time,总共有n墙),那么最大可能是多少?我直接写了500,不能说不对,但不周全导致后续无法思考。

重新梳理一遍:

  1. 付费刷墙数 + 免费刷墙数 = n
  2. 付费时间 + 免费刷墙数 >= n: 这是正确的推理却不是有效的信息
  3. 付费时间 >= 免费刷墙数
  4. 由1,3得到付费时间 >= n - 付费刷墙数
  5. 因为付费时间 = i=1i=付费数(time[i])\sum_{i=1}^{i=付费数}(time[i]), 所以我们可以得到 新付费时间 = i=1i=付费数(time[i]+1)n\sum_{i=1}^{i=付费数}(time[i] + 1) \ge n
  6. 我的思路哪怕跟着题解也卡在了这里,如何使用这time[i] + 1 暂停在这里仔细回顾条件1,我们要刷完所有墙,而这里的付费刷墙数免费刷墙数都是我们假设的答案。我们基于这个条件结合3得到的5也是我们的前提条件,而原本我们以n 作为体积转换成背包,正好可以用到这个条件。
  7. 使用01背包做题

错误梳理

t = time[i] + 1 为什么dpcopy[j + t] = min(dpcopy[j + t], dp[j] + cost[i]); 不对?因为在[0, t]这个区间根据我们的题意,这时候我们没有使用paid painter所以这里不能用免费的,而我们也必须要刷墙,所以在这个区间内必须用pad painter.