赞
踩
我们可以将施肥的过程看作是在一条时间轴上不断“拼接”若干个长度为 fields[i]/k 的工作日,题目的要求就是要找到最小的 k,使得这些工作日总数不超过 n。显然,k 越大,每个工作日的长度越短,所以总数就越多;k 越小,则工作日的长度越长,因此总数就越少。
因此,我们可以使用二分查找来快速定位最小的合适的 k。具体地,假设当前二分的区间为 [l, r],我们先计算出 mid = (l+r) // 2。接着,我们模拟施肥机以 k=mid 的能效完成施肥任务需要的天数 cnt,并与给定的 n 进行比较:
- 如果 cnt <= n,表示以 k=mid 的能效可以在规定天数内完成所有的施肥任务,因此我们继续在区间 [mid+1, r] 中寻找更小的 k;
- 如果 cnt > n,表示以 k=mid 的能效无法在规定天数内完成所有的施肥任务,因此我们需要在区间 [l, mid-1] 中寻找更大的 k。
不断重复以上过程,直到确定最小的合适的 k 为止。最终,我们返回的结果即为最小的合适的 k。
下面是题解的代码实现:
- def days_needed(k, fields):
- days = 0
- for field in fields:
- days += (field + k - 1) // k
- ret
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。