当前位置: 首页 > news >正文

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)

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新手学习打怪之编译安装LAMP和LNMP
  • PCL 点云ISS关键点提取算法
  • 《陈天奇:机器学习科研的十年》阅读笔记
  • SP: leopold (v1.2)
  • 《通义千问AI落地—下》:WebSocket详解
  • 学习记录:js算法(十六):四数之和
  • 渗透课程第二阶段--Part8--XXE渗透与防御
  • 激活函数的创新之旅:在PyTorch中自定义激活函数
  • 常用PHP JS MySQL 常用方法记录
  • TCP三次握手过程详解
  • Shell编程规范与变量:详解环境变量、位置变量与预定义变量
  • Java 入门指南:Java IO流 —— 序列化与反序列化
  • centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)
  • 加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!
  • 计算机专业的真正的就业情况
  • __proto__ 和 prototype的关系
  • 【React系列】如何构建React应用程序
  • CSS 专业技巧
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java知识点总结(JavaIO-打印流)
  • js学习笔记
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Redis在Web项目中的应用与实践
  • Selenium实战教程系列(二)---元素定位
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 如何合理的规划jvm性能调优
  • 如何利用MongoDB打造TOP榜小程序
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 算法-插入排序
  • ​queue --- 一个同步的队列类​
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (02)Hive SQL编译成MapReduce任务的过程
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (二)fiber的基本认识
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)关系数据库标准语言SQL
  • (学习日记)2024.01.19
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET性能优化(文摘)
  • @Pointcut 使用
  • [ SNOI 2013 ] Quare
  • []error LNK2001: unresolved external symbol _m
  • [2010-8-30]
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [BZOJ3223]文艺平衡树
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解
  • [CP_AUTOSAR]_系统服务_DEM模块(一)功能及模块间依赖关系介绍
  • [CSS3备忘] transform animation 等
  • [DAX] MAX函数 | MAXX函数