赞
踩
题目描述:
某农场主管理了一大片果园,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<iostream>
- #include<vector>
- #include<algorithm>
- using namespace std;
-
- int CalcDays(int k, const vector<int>& 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<int> 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<int> 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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。