项目排期 - 华为OD统一考试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。

假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。

输入描述

第一行输入为M个需求的工作量,单位为天,用逗号隔开。
例如:X1 X2 X3 … Xm
表示共有M个需求,每个需求的工作量分别为X1天,X2天…Xm天。其中0<M<30;0<Xm<200
第二行输入为项目组人员数量N
例如:
5
表示共有5名员工,其中0<N<10

输出描述

最快完成所有工作的天数
例如:
25
表示最短需要25天能完成所有工作

示例1

输入:
6 2 7 7 9 3 2 1 3 11 4
2

输出:
28

说明:
共有两位员工,其中一位分配需求6 2 7 7 3 2 1共需要28天完成,另一位分配需求9 3 11 4共需要27天完成,故完成所有工作至少需要28天。

题解

这道题可以使用二分查找 + 回溯来解决,二分的范围为需求工作量的最大值到总工作量的和。具体步骤如下:

  1. 定义一个二分查找范围,最小值为需求工作量的最大值 - 1,最大值为总工作量的和。
  2. 利用二分查找,查找最小的 MAX_SUM,使得每个人的工作量不超过 MAX_SUM。为了判断是否能满足条件,使用递归函数 ok (回溯法),在函数中模拟分配工作的过程,尝试将每个需求分配给不同的人员,看是否满足总工作量不超过 MAX_SUM。
  3. 如果能满足条件,则缩小二分查找范围为左半部分;否则,缩小二分查找范围为右半部分。
  4. 最终找到的二分查找范围左边界就是答案。

Java

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取每个工作的工作量
        int[] works = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 读取开发人员的数量
        int N = scanner.nextInt();

        Solution solution = new Solution(works, N);
        System.out.println(solution.solve());
    }
}


class Solution {
    int N;
    int[] works;

    public Solution(int[] works, int N) {
        this.N = N;
        this.works = works;
    }

    public int solve() {
        // 二分查找,找到最小的 MAX_SUM,使得每个人的工作量 <= MAX_SUM
        int l = Arrays.stream(works).max().getAsInt() - 1;
        int r = Arrays.stream(works).sum();

        while (l + 1 < r) {
            int mid = (l + r) >> 1;
            if (ok(0, mid, new int[N])) {
                r = mid;
            } else {
                l = mid;
            }
        }

        return r;
    }

    // 递归判断工作能否分配给 N 个人,使得每个人的总工作量 <= MAX_SUM
    private boolean ok(int idx, final int MAX_SUM, int[] sums) {
        if (idx == works.length) {
            return true;
        }

        for (int i = 0; i < N; i++) {
            // 尝试将 idx 个工作分配给第 i 个人员
            if (sums[i] + works[idx] <= MAX_SUM) {
                sums[i] += works[idx];
                if (ok(idx + 1, MAX_SUM, sums)) { // 可以完成分配,则直接返回 true
                    return true;
                }
                sums[i] -= works[idx];
            }
        }

        return false;
    }
}

Python

from typing import List


works = list(map(int, input().split()))
N = int(input())


def ok(idx: int, MAX_SUM: int, sums: List[int]) -> bool:
    """
    :param idx: 索引下标
    :param MAX_SUM: 每人总工作量的限制(最大值)
    :param sums:  sums[i] 表示第 i 个人需求的总工作量
    :return: 工作能否分配给 N 个人,使得每个人的总工作量 <= MAX_SUM
    """

    global N
    if idx == len(works):
        return True

    for i in range(N):
        if sums[i] + works[idx] <= MAX_SUM:  # 尝试将 idx 个工作分配给第 i 个人员
            sums[i] += works[idx]
            if ok(idx + 1, MAX_SUM, sums):
                return True
            sums[i] -= works[idx]

    return False


# 二分查找,找到最小的 MAX_SUM,使得每个人的工作量 <= MAX_SUM
# 每个需求只能由一个开发人员独立完成,因此 max(works) - 1 一定不可能是有效的解
l, r = max(works) - 1, sum(works)
while l + 1 < r:
    mid = (l + r) >> 1
    if ok(0, mid, [0] * N):
        r = mid
    else:
        l = mid
print(r)

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cstring>

using namespace std;

int N, wlen = 0;
int sums[10 + 5];
int works[30 + 5];


bool ok(int idx, const int MAX_SUM) {
    if (idx == wlen) {
        return true;
    }

    for (int i = 0; i < N; i++) {
        // 尝试将 idx 个工作分配给第 i 个人员
        if (sums[i] + works[idx] <= MAX_SUM) {
            sums[i] += works[idx];
            if (ok(idx + 1, MAX_SUM)) {
                return true;
            }
            sums[i] -= works[idx];
        }
    }

    return false;
}

int main() {
    // 读取每个工作的工作量
    while(cin >> works[wlen++]) {
        if(cin.peek() == '\n') break;
    }

    // 读取开发人员的数量
    cin >> N;

    // 二分查找,找到最小的 MAX_SUM,使得每个人的工作量 <= MAX_SUM
    int l = *max_element(works, works + wlen) - 1;
    int r = accumulate(works, works + wlen, 0);
    while (l + 1 < r) {
        int mid = (l + r) >> 1;
        memset(sums, 0, sizeof(sums));
        if (ok(0, mid)) {
            r = mid;
        } else {
            l = mid;
        }
    }

    cout << r << endl;

    return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/385613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研数据结构笔记(2)

线性表 线性表的定义线性表的基本操作lnitList(&L)DestroyList(&L)Listlnsert(&L,i,e)ListDelete(&L,i,&e)LocateElem(L,e)GetElem(L,i)Length(L)PrintList(L)Empty(L)Tips:引用值 小结 根据数据结构的三要素–逻辑结构、数据的运算、存储结构&#xff0c;…

文生图提示词:光线效果

色彩和光线 --光线效果 Lighting Effects 覆盖了光线效果的多个方面&#xff0c;包括光的性质、来源、作用方式以及光与物体相互作用产生的视觉效果&#xff0c;是摄影和视觉艺术中不可或缺的元素。 Soft Light 柔光 Hard Light 硬光 Natural Light 自然光 Artificial Light 人…

勒索病毒最新变种.target勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 在当今数字化时代&#xff0c;数据被视为企业和个人最重要的资产之一。然而&#xff0c;随着技术的进步&#xff0c;网络安全威胁也在不断演变。其中&#xff0c;勒索病毒是一种极具破坏性的威胁&#xff0c;而".target"勒索病毒是近期备受关注的一…

【开源】JAVA+Vue+SpringBoot实现学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

【分布式技术专题】「Zookeeper中间件」Paxos协议的原理和实际运行中的应用流程分析

Paxo算法介绍 Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。 Paxos产生背景 Paxos算法是基于消息传递且具有高度容错特性的一致性算法&#xff0c;是目前公认的解决分布式一致性问题最有效的算法之一&#xff0c;其解决的问题就是在分…

[算法前沿]--059-大语言模型Fine-tuning踩坑经验之谈

前言 由于 ChatGPT 和 GPT4 兴起,如何让人人都用上这种大模型,是目前 AI 领域最活跃的事情。当下开源的 LLM(Large language model)非常多,可谓是百模大战。面对诸多开源本地模型,根据自己的需求,选择适合自己的基座模型和参数量很重要。选择完后需要对训练数据进行预处…

mlxtend,一个非常好用的 Python 库!

前言 Python 的 MLxtend&#xff08;Machine Learning Extensions&#xff09;库是一个强大的工具&#xff0c;为机器学习实验提供了一系列功能强大的扩展和工具。本文将深入探讨 MLxtend 库的核心功能、用法以及如何在机器学习项目中充分发挥其优势。 目录 前言 什么是 MLx…

C++异常特性以及使用

异常 1.C传统的处理错误方式2.异常概念3.异常使用规则抛出和匹配规则 4.异常的重新抛出4.异常安全5.异常规范6.使用自定义的异常7.C标准异常体系7.异常优缺点 1.C传统的处理错误方式 终止程序&#xff1a;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&a…

简单介绍源程序执行方式

源程序执行方式 编译和解释 程序设计语言能够把算法翻译成机器能够理解的可执行程序。这里将计算机不能直接执行的非机器语言源程序翻译成能直接执行的机器语言的语言翻译程序称为语言处理程序 源程序&#xff1a;用各种程序设计语言编写的程序称为源程序&#xff0c;计算机不…

celery异步框架的使用

文章目录 celery的介绍celery的架构celery的快速使用celery 包结构celery 定时 异步 延迟任务django使用celery celery的介绍 celery是什么&#xff1f; -翻译过来是芹菜 -官网&#xff1a;https://docs.celeryq.dev/en/stable/ -吉祥物&#xff1a;芹菜 -分布式的异步任务框架…

单调队列优化DP问题

目录 1.滑动窗口 2.最大子序和 3.旅行问题 4.烽火传递 5.绿色通道 6.修剪草坪 7.理想的正方形 1.滑动窗口 154.给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向…

力扣_面试题:配对交换

配对交换 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目意思就是交换相邻两个二进制位 &#xff0c;用&分别取出even&#xff08;偶位和&#xff09;odd&#xff08;奇位和&#xff09; 偶位和用0xAAAAAAAA&#xff0c;奇…

ONLYOFFICE桌面编辑器8.0新特性:PDF表单、RTL支持、Moodle集成、本地界面主题等

ONLYOFFICE是由领先的IT公司—Ascensio System SIA经验丰富的IT专家开发的项目。这是一款强大的在线编辑器&#xff0c;能够为提供高效的文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 继 ONLYOFFICE 文档 v8.0发布后&#xff0c;适用于 Linux、Windows 和 macOS 的免费…

【C语言】实现栈

目录 &#xff08;一&#xff09;栈 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09; 栈的销毁 &#xff08;3&#xff09;压栈 &#xff08;4&#xff09; 出栈 &#xff08;5&a…

MATLAB知识点:unifrnd函数(★★★☆☆)生成任意区间内均匀分布的随机数

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

Vue3高频知识点和写法

一 Vue插件 二 vue3项目创建 创建完成后npm install npm run dev 三 setup 一 响应式数据 setup函数是用来代替data和methods的写法的&#xff0c;在setup函数中声明的数据和函数&#xff0c;导出后可以在页面中使用。 但是暂时不是响应式数据&#xff0c;如果要响应式数据的…

2023年03月CCF-GESP编程能力等级认证C++编程二级真题解析

一、单选题(每题2分,共30分) 第1题 以下存储器中的数据不会受到附近强磁场干扰的是( )。 A.硬盘 B.U盘 C.内存 D.光盘 答案:D 第2题 下列流程图,属于计算机的哪种程序结构?( )。 A.顺序结构 B.循环结构 C.分支结构 D.数据结构 答案:C 第3题 下列关…

CVE-2023-22602 漏洞复现

CVE-2023-22602 简述&#xff1a; 由于 1.11.0 及之前版本的 Shiro 只兼容 Spring 的ant-style路径匹配模式&#xff08;pattern matching&#xff09;&#xff0c;且 2.6 及之后版本的 Spring Boot 将 Spring MVC 处理请求的路径匹配模式从AntPathMatcher更改为了PathPatter…

【数据结构】11 堆栈(顺序存储和链式存储)

定义 可认为是具有一定约束的线性表&#xff0c;插入和删除操作都在一个称为栈顶的端点位置。也叫后入先出表&#xff08;LIFO&#xff09; 类型名称&#xff1a;堆栈&#xff08;STACK&#xff09; 数据对象集&#xff1a; 一个有0个或者多个元素的有穷线性表。 操作集&#…

【医学知识图谱 自动补全 关系抽取】生成模型 + 医学知识图谱 = 发现三元组隐藏的关系实体对

生成模型 医学知识图谱 发现三元组新关系实体对 提出背景问题&#xff1a;如何自动发现并生成医疗领域中未被标注的实体关系三元组&#xff1f;CRVAE模型 提出背景 论文&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3219819.3220010 以条件关系变分自编码器&#xff08;…