华为OD机试 - 农场施肥(Java 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某农村主管理了一大片果园,fields[i]表示不同国林的面积,单位m2,现在要为所有的果林施肥且必须在n天之内完成,否则影响收成。小布是国林的工作人员,他每次选择一片果林进行施肥,且一片国林施肥完后当天不再进行施肥作业。

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

二、输入描述

第一行输入为m和n,m表示fields中的元素个数,n表示施肥任务必须在n天内(含n天)完成;

第二行输入为fields,fields[i]表示果林i的面积,单位:m2

三、输出描述

对于每组数据,输出最小施肥机的能效k,无多余空格。

补充说明:

1 <= fields.length <= 104
1 <= n < 109
1<= fields[i] <= 109

四、解题思路

  1. 首先读取输入的果园数量 m 和需要完成施肥任务的天数 days;
  2. 使用循环读取果园面积,将其存储在整数数组 fields 中;
  3. 找到果园面积的最大值,用变量 maxFields 记录;
  4. 根据给定的条件进行判断:
    • 如果需要完成施肥任务的天数小于果园数量,即 days < m,则无法在规定天数内完成施肥任务,输出 -1;
    • 如果需要完成施肥任务的天数等于果园数量,即 days == m,则直接输出最大果园面积 maxFields;
    • 否则,调用 getMin() 方法计算最小施肥机的能效 k,并输出结果;
  5. 在 getMin() 方法中,使用二分查找来确定最小施肥机的能效 k;
    • 初始化二分查找的起始值 start 为 1,终止值 end 为 maxFields;
    • 进入循环,直到 start + 1 < end,每次迭代都更新 mid 为 start 和 end 的中间值;
    • 在每次迭代中,计算使用当前的 mid 值时所需的总天数 sumDays;
    • 遍历果园面积数组 fields,对于每个果园面积,根据能效 mid 计算所需的天数,并累加到 sumDays 中;
    • 如果 sumDays 大于给定的天数 days,说明当前的 mid 值太小,需要增大能效,将 start 更新为 mid;
    • 否则,将 end 更新为 mid;
  6. 返回 start + 1,即为最小施肥机的能效 k;

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 果园数量
    int m = sc.nextInt();
    // 需要完成施肥任务的天数
    int days = sc.nextInt();
    // 使用循环读取果园面积
    int[] fields = new int[m];
    for (int i = 0; i < m; ++i) {
        fields[i] = sc.nextInt();
    }
    int maxFields = fields[0];
    for (int i = 0; i < m; ++i) {
        maxFields = Math.max(maxFields, fields[i]);
    }

	// 如果需要完成施肥任务的天数小于果园数量
    if (days < m) {
    	// 无法在规定天数内完成施肥任务,输出 -1
        System.out.println(-1);
        // 如果需要完成施肥任务的天数等于果园数量
    } else if (days == m) {
    	// 直接输出最大果园面积 maxFields
        System.out.println(maxFields);
    } else {
    	// 计算最小施肥机的能效 k
        System.out.println(getMin(maxFields, fields, days));
    }
}

// 计算最小施肥机的能效
// 使用二分查找来确定最小施肥机的能效
public static int getMin(int max, int[] fields, int days) {
	// 初始化二分查找的起始值
    int start = 1;
    // 终止值 end 为 max
    int end = max;
    
	// 每次迭代都更新 mid 为 start 和 end 的中间值
    while (start + 1 < end) {
        int mid = (start + end) / 2;
        int sumDays = 0;

		// 对于每个果园面积,根据能效 mid 计算所需的天数,并累加到 sumDays 中
        for (int i = 0; i < fields.length; ++i) {
            if (fields[i] % mid == 0) {
                sumDays += fields[i] / mid;
            } else {
                sumDays += (fields[i] / mid) + 1;
            }
        }
	
		// 如果 sumDays 大于给定的天数 days,说明当前的 mid 值太小,
        // 需要增大能效,将 start 更新为 mid
        if (sumDays > days) {
            start = mid;
        } else {
            end = mid;
        }
    }
    return start + 1;
}

六、效果展示

1、输入

5 9
5 6 7 8 9

2、输出

5

3、说明

当能效为5时,fields[0]需要1天,fields[1]需要2天,fields[2]需要2天,fields[3]需要2天,fields[4]需要2天,一共需要9天,不会影响收成。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值