news 2026/5/2 18:33:11

手撕代码2——华为笔试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手撕代码2——华为笔试
21、大模型推理资源的最低成本分发

题目描述

当前只有若干个并发的大模型推理服务器,推理资源紧张,但是有 $N$ 个推理请求任务在申请推理服务中。每个推理服务都有一个优先级的分值,要求对每个推理请求任务分发推理资源。每个任务至少分配 1 千个 token 消耗的推理资源,相邻的两个任务,优先级高的那个任务会获得更多的 token 数($X$ 千个 token 数)。请给每个推理请求任务分发 token,确保 $N$ 个请求任务消耗的 token 数最少(单位:千个 token)。

解答要求

  • 时间限制:C/C++ 1000ms, 其他语言: 2000ms

  • 内存限制:C/C++ 512MB, 其他语言: 1024MB

输入

输入是一个优先级的数组,数值越大,优先级越高。例如:1, 2, 3

如果优先级小于等于 0 或者为空,该任务需要被放弃,不分配任务 token,且它的相邻任务不与该任务进行优先级比较。

比如:[1, -1, 2]的 token 总数是 2 千个。

输出

输出一个整数,代表 $N$ 个请求任务消耗的最少 token 总数。

(例如:输出6,代表分别给第一、二、三个任务分发 1 千、2 千、3 千个 token。)


样例 1
  • 输入:10, 10, 5

  • 输出:4

  • 解释:分别给第一、二、三个任务分发 1 千、2 千、1 千个 token。

样例 2
  • 输入:4, 2, 6

  • 输出:5

  • 解释:分别给第一、二、三个任务分发 2 千、1 千、2 千个 token。

根据你提供的题目描述和样例,这道题是一个典型的贪心算法问题,与经典的“分发糖果”(Candy Problem)非常相似。

题目核心逻辑分析

  1. 基础配额:每个有效任务(优先级 $> 0$)至少分配 $1$ 单位($1000$ tokens)。

  2. 相邻比较:对于相邻的两个任务,如果其中一个优先级更高,它获得的 tokens 必须更多。

  3. 相等优先级:如果相邻任务优先级相等,题目并未强制要求它们获得相同数量,为了使总数最小,我们只需确保高优先级者更多,若相等则互不干扰。

  4. 特殊情况:优先级 $\le 0$ 或为空的任务被放弃(分配 $0$ tokens),且它们不参与相邻任务的优先级比较。这相当于将任务序列按放弃的任务为界,分割成了若干个独立的子序列。

算法设计:双向贪心扫描

为了严格遵守时间复杂度 $O(N)$ 和空间复杂度 $O(N)$,我们采用两次遍历的方法:

  1. 从左向右遍历:如果当前任务优先级高于左侧任务,则当前任务的 tokens 在左侧基础上 $+1$。

  2. 从右向左遍历:如果当前任务优先级高于右侧任务,则当前任务的 tokens 必须大于右侧。此时需取“当前值”与“右侧值 $+1$”的较大者,以同时满足左右两边的约束

import sys def solve(): # 从标准输入读取全部内容并去除首尾空白字符 try: input_data = sys.stdin.read().strip() except EOFError: return if not input_data: return # 预处理:去除输入中可能存在的方括号 [ ],并按逗号分割 # 兼容 "10,10,5" 或 "[10,10,5]" 等格式 cleaned_str = input_data.replace('[', '').replace(']', '') if not cleaned_str: # 如果处理后为空(如输入是 "[]"),输出 0 print(0) return parts = cleaned_str.split(',') n = len(parts) priorities = [] # 1. 解析优先级并初始化 tokens 数组 # 优先级 <= 0 或为空的任务分配 0,其余初始分配 1 tokens = [0] * n for i in range(n): item = parts[i].strip() if not item: priorities.append(-1) # 视为空任务为已放弃 else: try: val = int(item) priorities.append(val) if val > 0: tokens[i] = 1 except ValueError: # 处理非数字字符串(如 null) priorities.append(-1) # 2. 前向遍历(左 -> 右):确保比左邻居优先级高的任务拿更多 token for i in range(1, n): # 只有当相邻两任务都有效(>0)时才进行比较 if priorities[i] > 0 and priorities[i-1] > 0: if priorities[i] > priorities[i-1]: tokens[i] = tokens[i-1] + 1 # 3. 后向遍历(右 -> 左):确保比右邻居优先级高的任务拿更多 token for i in range(n - 2, -1, -1): if priorities[i] > 0 and priorities[i+1] > 0: if priorities[i] > priorities[i+1]: # 取当前值与 (右侧+1) 的最大值,以同时满足左右约束 tokens[i] = max(tokens[i], tokens[i+1] + 1) # 输出最终的总 token 数(按题目单位:千个) print(sum(tokens)) if __name__ == '__main__': solve()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 18:53:31

联想AI产品经理面试题精选:10道高频考题+答案解析

适合备考联想AI产品经理岗位的同学&#xff0c;涵盖AI产品思维、硬件AI结合、数据分析、产品方法论四大板块一、AI产品思维篇&#xff08;大模型应用场景、AIGC产品化&#xff09;第1题&#xff1a;你怎么理解大模型在PC端的落地场景&#xff1f;联想在这件事上有哪些优势&…

作者头像 李华
网站建设 2026/4/30 18:51:27

P-PQ-Q图怎么做:SPSSAU软件操作步骤与结果解读

一、P-P/Q-Q图所属模块P-P/Q-Q图在SPSSAU中属于【可视化】模块。二、方法概述P-P/Q-Q图主要用于直观观察数据分布是否接近正态状态&#xff0c;常用于描述统计、回归分析、方差分析等前置检查环节。如果研究者希望先判断数据分布形态&#xff0c;再决定后续是否适合使用参数检验…

作者头像 李华
网站建设 2026/4/30 18:51:25

NAS服务器配置

一、NAS介绍 1.1、NAS 是什么? 一台专门用来存文件、插硬盘、24 小时开机的小型私有服务器,自带系统,插几块硬盘,连家里 / 公司路由器,手机、电脑、电视、平板全都能联网访问里面的资料。 区别于普通移动硬盘: 移动硬盘:插电脑才能用,只能一台设备用 NAS:连网线放角…

作者头像 李华
网站建设 2026/4/30 18:43:24

Bilibili-Evolved如何突破60fps流畅播放瓶颈:深度性能调优实战指南

Bilibili-Evolved如何突破60fps流畅播放瓶颈&#xff1a;深度性能调优实战指南 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved作为一款专业的哔哩哔哩增强脚本&#xff0c;…

作者头像 李华
网站建设 2026/4/30 18:37:56

ESPTool终极指南:5分钟掌握ESP芯片烧录与调试技巧

ESPTool终极指南&#xff1a;5分钟掌握ESP芯片烧录与调试技巧 【免费下载链接】esptool Serial utility for flashing, provisioning, and interacting with Espressif SoCs 项目地址: https://gitcode.com/gh_mirrors/es/esptool ESPTool是乐鑫科技官方推出的开源Pytho…

作者头像 李华