【OD机试题笔记】高效的任务规划

题目描述

你有 n 台机器,编号为 1~n,每台都需要完成一项工作,机器经过配置后都能独立完成一项工作。假设第 i 台机器你需要花 B 分钟进行设置,然后开始运行,J 分钟后完成任务。
现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。 注意,不能同时对两台进行配置,但配置完成的机器们可以同时执行他们各自的工作.

输入描述
第一行输入代表总共有 M 组任务数据 (1<M<=10)。每组数第一行为一个整数指定机器的数量 N (0<N<=1000)。 随后的 N 行每行两个整数,第一个表示 B (0<=B<=10000),第二个表示 J (0<=J<=10000)

每组数据连续输入,不会用空行分隔。各组任务单独计时。

输出描述
对于每组任务,输出最短完成时间,且每组的结果独占一行。例如,两组任务就应该有两行输出

** 示例1
输入
1
1
2 2
输出
4
说明>输出共 3 行数据,第 1 行代表只有 1 组数据;第 2 行代表本组任务只有 1 台机器;第 3 行代表本机器:配置需要 2 分钟,执行需要 2 分钟。输出 1 行数据,代表执行结果为 4 分钟。

** 示例2
输入
2
2
1 1
2 2
3
1 1
2 2
3 3
输出
4
7
说明>第一行代表输入共 2 组数据, 2 - 4 行代表第一组数据,为 2 台机器的配置、执行信息(第 1 台机器:配置需要 1 分钟,执行需要 1 分钟;第 2 台机器:配置需要 2 分钟,执行需要 2 分钟)。
5 - 8 行代表第二组数据,为 3 台机器的配置、执行信息(意义同上)。输出共 2 行,分别代表第 1 组任务共需要 4 分钟和第 2 组任务需要 7 分钟(先配置 3,在配置 2,最后配置 1,执行 1 分钟,共 7 分钟)。

思路

核心思路总结

  1. 算法选型:贪心算法,核心是通过最优局部选择推导全局最优解;
  2. 排序规则:将机器按「执行时间J从大到小」排序(J相同无需额外处理,因B不影响核心逻辑),优先配置执行时间长的机器;
  3. 核心计算
    • 维护sumB(累计配置时间):配置需串行执行,逐台累加每台机器的配置时间B;
    • 计算单台机器完成时间:sumB + 该机器执行时间J(配置完成后机器并行执行,完成时间为配置累计时间+自身执行时间);
    • 总耗时为所有机器完成时间的最大值(并行执行下,最后完成的机器决定总耗时);
  4. 流程:按组数遍历→读取每组机器数据→贪心排序→计算累计配置时间和最大完成时间→收集结果并输出。

时空复杂度

  • 时间复杂度:O(M×N log N)
    • M为任务组数(M≤10),N为每组机器数(N≤1000);
    • 核心耗时为机器排序操作(O(N log N)),每组数据的遍历计算为O(N),整体复杂度由排序主导;
  • 空间复杂度:O(N)
    • 需存储每组机器的B/J信息(O(N)),结果数组存储每组答案(O(M),M≤10可忽略),整体空间由机器数据存储主导。

代码

function solution() {
   
   
    const M = Number(readline());
    const results 
### 创建个人知识库的方法或工具 #### 使用 OneNote 或 Evernote 打造个人知识库 OneNote 和 Evernote 是两款非常流行的笔记软件,能够帮助用户高效管理信息。这些应用支持多平台同步,允许随时随地记录想法、整理资料并分类存储文档。通过标签、笔记本分组等功能,可以轻松构建结构化的个人知识体系[^1]。 #### 利用 Notion 构建个性化知识管理系统 Notion 是一款集成了笔记撰写、任务管理和数据库功能的强大工具。其灵活的页面布局和丰富的插件生态使得创建个性化的知识库变得简单而有趣。无论是编写文章还是规划项目进度,在同一个平台上完成多种工作成为可能。此外,内置的任务分配与时间追踪特性有助于提高工作效率。 #### 借助 Roam Research 实现互联思考网络 Roam Research 特别适合那些追求深层次理解和创造性思维的人士。这款应用程序采用双向链接制,鼓励使用者之间建立概念之间的关联,从而形成一张复杂的知识图谱。随着时间推移,这种基于连接性的积累方式可以帮助人们更好地发现隐藏模式和发展新的见解。 #### 应用 Obsidian 自定义专属的知识空间 Obsidian 是一个开源的日志型笔记程序,强调隐私保护的同时提供了高度自定义的可能性。借助社区开发的各种插件,可以从简单的文本编辑器转变为复杂的数据可视化平台。Markdown 文件格式的支持让内容更加易于分享和迁移,同时也方便与其他服务集成使用。 ```python # Python 示例:自动化备份 Obsidian 数据库至 GitHub import os from github import Github def backup_obsidian_vault(github_token, repo_name, local_path): g = Github(github_token) user = g.get_user() repo = user.create_repo(repo_name) for root, dirs, files in os.walk(local_path): for file in files: with open(os.path.join(root, file), 'r', encoding='utf-8') as f: content = f.read() path_in_repo = os.path.relpath(os.path.join(root, file), start=local_path).replace("\\", "/") if not any([item.name == path_in_repo.split('/')[-1] and item.type=='file' for item in list(repo.get_contents(""))]): try: repo.create_file(path_in_repo, "Initial commit of {}".format(file), content) except Exception as e: print(f"Failed to upload {file}: ", str(e)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值