OD C卷 - 项目排期/最少交付时间

2024-08-28 01:04

本文主要是介绍OD C卷 - 项目排期/最少交付时间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目排期/最少交付时间(200)

  • m个独立的需求,由n个开发者完成;
  • 每个任务都是独立的,只能由一个人完成;
  • 计算项目最少的交付时间;

输入描述:
第一行输入m个需求的工作量(天数),m在(0,30)之间,每个需求的天数<200
第二行输入人员数量n
输出描述:
项目最少的交付时间

示例1
输入:
6 2 7 7 9 3 2 1 3 11 4
2
输出:
28

示例2
输入:
2 3 4 2 5
3
输出:
6

示例3
输入:
100 50 30 10
3
输出:
100

思路:

  • 二分求解
    • 需求的工作量升序排序;
    • 取完成需求的最小天数,计为 left = sum // n ;
    • 取一个人完成时耗费的天数为最大,计为 right = sum;
    • 二分法取 mid = (left + right) // 2,判断在这个mid以内是否能够在n个人之间完成需求的分配(每个人完成需求的天数<=mid);
      • 若可以完成分配,则进一步减少天数,令result = mid; right = mid-1; 否则 left=mid+1;
      • 需求的分配是从需求天数最小开始,依次分配给n个人,若给一个人分配后,其完成天数超出mid阈值,则将当前需求分配给下一个人
      • 最后求得result
result = -1class MinimumTime:def solution(self, req_days, n):# 总天数total = sum(req_days)self.m = len(req_days)self.req_days = req_days# 分配需求的数组self.jobs = [0 for i in range(n)]# 需求工作量 排序req_days.sort()# 最小天数left = total // n# 最大天数right = total# 依次求解global resultwhile left <= right:print("left:", left)print("right:", right)mid = (left + right) // 2print("mid:", mid)# 清空jobsfor i in range(n):self.jobs[i] = 0# 是否可以成功分配if self.align_req(0, mid):print("成功:")result = midright = mid - 1else:print("失败:")left = mid + 1# low与最大的需求天数对比# print(low if low > req_days[-1] else req_days[-1])def align_req(self, days_idx, threshold):# 递归分配任务global nif days_idx >= self.m:# 分配完成return Truei = 0  # 依次分配给n个人while True:if i >= n:breakelse:total_v = self.req_days[days_idx] + self.jobs[i]if total_v > threshold:if self.jobs[i] == 0: # 还没分配 就超出阈值breakelse:# 需求到开发 成功分配self.jobs[i] += self.req_days[days_idx]# 按照当前阈值,继续分配下一个需求if self.align_req(days_idx + 1, threshold):return True# 下一个需求无法完成分配,当前分配撤销self.jobs[i] -= self.req_days[days_idx]i += 1return Falseif __name__ == '__main__':mini_time = MinimumTime()req_days = list(map(int, input("days:").strip().split()))n = int(input("n:").strip())mini_time.solution(req_days, n)print(result)

 

这篇关于OD C卷 - 项目排期/最少交付时间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113291

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建