当前位置:   article > 正文

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

不爱施肥的小布od

题目描述:

某农场主管理了一大片果园,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
 

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. int CalcDays(int k, const vector<int>& fields)
  6. {
  7. if (k == 0)return 1000000000;
  8. int d = 0;
  9. for (auto f : fields)
  10. {
  11. d += (f + k - 1) / k;
  12. }
  13. return d;
  14. }
  15. int main()
  16. {
  17. int m, n;
  18. while (cin >> m >> n)
  19. {
  20. vector<int> fields;
  21. while (m--)
  22. {
  23. int area;
  24. cin >> area;
  25. fields.push_back(area);
  26. }
  27. // 优化
  28. if (m > n)
  29. {
  30. cout << -1 << endl;
  31. continue;
  32. }
  33. sort(fields.begin(), fields.end());
  34. int left = 0, right = fields.back() + 1;
  35. while (left < right)
  36. {
  37. int mid = (left + right) / 2;
  38. int d = CalcDays(mid, fields);
  39. if (d <= n)
  40. {
  41. right = mid - 1;
  42. }
  43. else
  44. {
  45. left = mid + 1;
  46. }
  47. }
  48. int mid = (left + right) / 2;
  49. mid = max(1, mid);
  50. int d0 = CalcDays(mid - 1, fields);
  51. int d1 = CalcDays(mid, fields);
  52. int d2 = CalcDays(mid + 1, fields);
  53. vector<int> tmp{ d0, d1, d2 };
  54. int result = -1;
  55. for (int i = 0; i < tmp.size(); i++)
  56. {
  57. if (tmp[i] <= n)
  58. {
  59. result = mid + (i - 1); //tmp[i];
  60. break;
  61. }
  62. }
  63. cout << result << endl;
  64. }
  65. }
  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner in = new Scanner(System.in);
  5. int m = in.nextInt();
  6. int days = in.nextInt();
  7. int[] fields = new int[m];
  8. for (int i = 0; i < m; ++i) {
  9. fields[i] = in.nextInt();
  10. }
  11. int maxFields = fields[0];
  12. for (int i = 0; i < m; ++i) {
  13. maxFields = Math.max(maxFields, fields[i]);
  14. }
  15. if (days < m) {
  16. System.out.println(-1);
  17. } else if (days == m) {
  18. System.out.println(maxFields);
  19. } else {
  20. System.out.println(getMinK(maxFields, fields, days));
  21. }
  22. }
  23. public static int getMinK(int maxK, int[] fields, int days) {
  24. int start = 1;
  25. int end = maxK;
  26. while (start + 1 < end) {
  27. int mid = (start + end) / 2;
  28. int sumDays = 0;
  29. for (int i = 0; i < fields.length; ++i) {
  30. if (fields[i] % mid == 0) {
  31. sumDays += fields[i] / mid;
  32. } else {
  33. sumDays += (fields[i] / mid) + 1;
  34. }
  35. }
  36. if (sumDays > days) {
  37. start = mid;
  38. } else {
  39. end = mid;
  40. }
  41. }
  42. return start + 1;
  43. }
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/121286
推荐阅读
相关标签
  

闽ICP备14008679号