2025B-农场施肥-200分

刷题笔记合集🔗

问题描述

某农场主管理了一大片果园,fields[i]表示不同果林的面积(单位:m²)。现在要为所有果林施肥,且必须在n天内完成,否则影响收成。

小布是果林的工作人员,他每次选择一片果林进行施肥,且一片果林施肥完后当天不再进行施肥作业。

假设施肥机的能效为k(单位:m²/day),请问至少租赁能效k为多少的施肥机才能确保不影响收成?如果无法完成施肥任务,则返回-1。

输入格式

第一行输入两个整数m和n:

  • m表示果林数量
  • n表示施肥任务必须在n天内(含n天)完成

第二行输入m个整数,表示每片果林的面积。

输出格式

输出一个整数,表示最小施肥机的能效k。如果无法完成任务,输出-1。

数据范围

  • 1 ≤ fields.length ≤ 10^4
  • 1 ≤ n ≤ 10^9
  • 1 ≤ fields[i] ≤ 10^9

样例1

输入:

5 7
5 7 9 15 10

输出:

9

说明:

  • 当能效k=9时:
    • fields[0]=5需要1天
    • fields[1]=7需要1天
    • fields[2]=9需要1天
    • fields[3]=15需要2天
    • fields[4]=10需要2天
  • 共需要7天,不会影响收成

样例2

输入:

3 1
2 3 4

输出:

-1

说明:

  • 一天最多完成一片果林的施肥
  • 3片果林至少需要3天
  • 无论k为多少都无法在1天内完成
  • 所以返回-1

题解

这道题目可以使用二分查找来解决:

  1. 确定k的搜索范围:
    • 最小值为1
    • 最大值为max(fields)
  2. 二分查找k:
    • 对于每个k,计算完成所有果林需要的天数
    • 如果天数>n,说明k太小
    • 如果天数≤n,说明k可能是答案
  3. 找到满足条件的最小k

时间复杂度为 ,其中 是果林数量, 是最大果林面积。

参考代码

# 读取输入
m, n = map(int, input().split())
fields = list(map(int, input().split()))

def check(k, n, fields):
    # 计算能效k完成所有果林需要的天数
    days = 0
    for area in fields:
        if k >= area:
            days += 1  # 面积小于能效,一天完成
        else:
            days += (area + k - 1) // k  # 向上取整
    return days <= n

def solve(n, fields):
    if len(fields) > n:  # 果林数量大于天数,无解
        return -1
        
    left, right = 1, max(fields)
    ans = -1
    
    while left <= right:
        mid = (left + right) // 2
        if check(mid, n, fields):
            ans = mid
            right = mid - 1  # 尝试更小的k
        else:
            left = mid + 1
            
    return ans

print(solve(n, fields))
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
      

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

09-23 17:42
门头沟学院 Java
兄弟们我绷不住了,小米要求10月份参加编程考试,20级以下(王腾好像21),正式和外包都得去,还要部门大排名,一巴掌给我抽象的回到大学
flex*1022:雷:我们想了很久,到底怎么样才能让用户满意,让工程师保持手感,经过长达180天的思考,我连夜睡服高管,决定发起内部考试,以编程为主
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
入职华为的第一步:投递
投递华为技术有限公司等公司10个岗位
点赞 评论 收藏
分享
xiaolihuam...:当然还有一种情况是你多次一面挂,并且挂的原因都比较类似,例如每次都是算法题写不出来。面试官给你的评价大概率是算法能力有待加强,算法能力有待提高,基础知识掌握的不错,项目过关,但是coding要加强。短期内高强度面试并且每次都是因为同样的原因挂(这个你自己肯定很清楚),会形成刻板印象,因为你偶尔一次算法写不出来,面试官自己也能理解,因为他清楚的知道自己出去面试也不一定每一次面试算法都能写出来。但是连续几次他发现你的面屏里面都是算法有问题,他就认为这不是运气问题,而是能力问题,这种就是很客观的评价形成了刻白印象,所以你要保证自己。至少不能连续几次面试犯同样的错。算法这个东西比较难保证,但是有些东西是可以的,例如某一轮你挂的时候是因为数据库的索引,这个知识点答的不好,那你就要把数据库整体系统性的复习,下一轮面试你可以,项目打的不好,可以消息队列答的不好,但是绝对不可以数据库再答的不好了。当然事实上对于任何面试都应该这样查漏补缺,只是对于字节来说这个格外重要,有些面试官真的会问之前面试官问过的问题
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-20 19:41
那一天的Java_J...:简历完全流水账,学生思维很严重,还有很大的优化空间,可以多看看牛客的简历。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-24 11:13
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务