2023华为OD机试真题-不爱施肥的小布(JAVA、Python、C++)

题目描述:

某农场主管理了一大片果园,fields[i] 表示不同果林的面积,单位:(m^2),现在要为所有的果林施肥且必须在 n 天之内完成,否则影响收成。小布是果林的工作人员,他每次选择一片果林进行施肥,且一片果林施肥完后当天不再进行施肥作业。假设施肥机的能效为k,单位:(m^2/day),请问至少租赁能效 k 为多少的施肥机才能确保不影响收成?如果无法完成施肥任务,则返回 -1。

输入描述:

第一行输入为 m 和 n,m 表示 fields 中的元素个数,n 表示施肥任务必须在 n 天内(含 n 天)完成;
第二行输入为 fields,fields[i] 表示果林i的面积,单位:(m^2)

输出描述:

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

补充说明:

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] 需要1天,fields[1] 需要1天,fields[2] 需要1天,fields[3] 需要2天,fields[4] 需要2天,共需要7天,不会影响收成。

示例2

输入:

3 1
2 3 4
输出:

-1
说明:

由于一天最多完成一片果林的施肥,无论 k 为多少都至少需要3天才能完成施肥,因此返回-1
 

#include
#include
#include
using namespace std;
 
int CalcDays(int k, const vector& fields)
{
    if (k == 0)return 1000000000;
    int d = 0;
    for (auto f : fields)
    {
        d += (f + k - 1) / k;
    }
    return d;
}
 
int main()
{
    int m, n;
    while (cin >> m >> n)
    {
        vector fields;
        while (m--)
        {
            int area;
            cin >> area;
            fields.push_back(area);
        }
 
        // 优化
        if (m > n)
        {
            cout << -1 << endl;
            continue;
        }
         
        sort(fields.begin(), fields.end());
 
        int left = 0, right = fields.back() + 1;
        while (left < right)
        {
            int mid = (left + right) / 2;
            int d = CalcDays(mid, fields);
            if (d <= n)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }
        int mid = (left + right) / 2;
        mid = max(1, mid);
        int d0 = CalcDays(mid - 1, fields);
        int d1 = CalcDays(mid, fields);
        int d2 = CalcDays(mid + 1, fields);
        vector tmp{ d0, d1, d2 };
        int result = -1;
        for (int i = 0; i < tmp.size(); i++)
        {
            if (tmp[i] <= n)
            {
                result = mid + (i - 1); //tmp[i];
                break;
            }
        }
        cout << result << endl;
    }
}
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int days = in.nextInt();
        int[] fields = new int[m];
        for (int i = 0; i < m; ++i) {
            fields[i] = in.nextInt();
        }
        int maxFields = fields[0];
        for (int i = 0; i < m; ++i) {
            maxFields = Math.max(maxFields, fields[i]);
        }
        if (days < m) {
            System.out.println(-1);
        } else if (days == m) {
            System.out.println(maxFields);
        } else {
            System.out.println(getMinK(maxFields, fields, days));
        }
    }
 
    public static int getMinK(int maxK, int[] fields, int days) {
        int start = 1;
        int end = maxK;
        while (start + 1 < end) {
            int mid = (start + end) / 2;
            int sumDays = 0;
            for (int i = 0; i < fields.length; ++i) {
                if (fields[i] % mid == 0) {
                    sumDays += fields[i] / mid;
                } else {
                    sumDays += (fields[i] / mid) + 1;
                }
            }
            if (sumDays > days) {
                start = mid;
            } else {
                end = mid;
            }
        }
        return start + 1;
    }
}

你可能感兴趣的:(华为OD机试真题2023,c++,算法,java,华为,python)