不爱施肥的小布

我们可以将施肥的过程看作是在一条时间轴上不断“拼接”若干个长度为 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
    return days
def min_fertilizer(fields, n):
    l = 1               # 施肥机能效的可能取值范围:[1, max(fields)]
    r = max(fields)
    while l < r:
        mid = (l + r) // 2
        if days_needed(mid, fields) <= n:
            r = mid
        else:
            l = mid + 1
    return l

其中,函数 `days_needed(k, fields)` 用于计算以施肥机能效 k 完成施肥任务需要的天数。在该函数中,我们把每个果林的面积除以 k 并向上取整,表示完成该果林的施肥任务至少需要的天数。这样,就可以计算出全部的施肥任务需要的总天数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值