2023 华为od笔试题 0420

笔试时间:2023年4月20日 暑期实习

第一题

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

5 7

5 7 9 15 10

示例2:

3 1

2 3 4

示例输出

示例1:

9

示例2:

-1

说明:

当能效k为9时,fields[0]需要1天,fields[1]需要1天,fields[2]需要1天,fields[3]需要2天,fields[4]需要2天,一共7天完成,最小的施肥效能为9;由于一天最多完成一片果林的施肥,无论k为多少都至少需要3天才能完成施肥,因此返回-1。

参考题解

二分法

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
using namespace std;

int m, n;
vector<int> fileSizes;

// 检查是否可以将文件放入存储中,以k为最大文件大小
bool canStoreFiles(int k) {
    int currentStorage = 0;
    for (int fileSize : fileSizes) {
        currentStorage += fileSize / k;
        if (fileSize % k != 0) {
            currentStorage += 1;
        }
    }
    return currentStorage <= n;
}

int main() {
    cin >> m >> n;
    fileSizes.resize(m);
    
    for (int i = 0; i < m; i++) {
        cin >> fileSizes[i];
    }

    if (n < m) {
        cout << -1 << endl;
    } else {
        int left = 0, right = 1e9;
        while (left < right) {
            int mid = (left + right) / 2;
            if (canStoreFiles(mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        cout << left << endl;
    }
    
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    static int m, n;
    static int[] files;

    static boolean check(int k) {
        int cur = 0;
        for (int file : files) {
            cur += file / k;
            if (file % k != 0) {
                cur += 1;
            }
        }
        return cur <= n;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        m = scanner.nextInt();
        n = scanner.nextInt();
        files = new int[m];

        for (int i = 0; i < m; i++) {
            files[i] = scanner.nextInt();
        }

        if (n < m) {
            System.out.println(-1);
        } else {
            int l = 0, r = (int) 1e9;
            while (l < r) {
                int mid = (l + r) / 2;
                if (check(mid)) {
                    r = mid;
                } else {
                    l = mid + 1;
                }
            }
            System.out.println(r);
        }
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def check(k):
    cur = 0
    for file in files:
        cur += file // k
        if file % k != 0:
            cur += 1
    return cur <= n

m, n = map(int, input().split())
files = list(map(int, input().split()))

if n < len(files):
    print(-1)
else:
    l, r = 0, 10**9
    while l < r:
        mid = (l + r) // 2
        if check(mid):
            r = mid
        else:
            l = mid + 1
    print(r)

第二题

给你一个整数数组nums,请计算数组的中心位置。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有无素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。如果数组有多个中心位置,应该返回最靠近

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务