1 条题解
-
0
问题理解
我们有:
- 类产品,第 类需要 件
- 名员工,员工 能制造产品 当且仅当
- 每个员工的愤怒值是分段线性函数:制造第 件产品的边际愤怒值 随 所在区间变化,且 单调递增
目标:将产品合理分配给员工,满足所有需求,并最小化总愤怒值。
关键观察
-
问题本质
这是一个带约束的资源分配问题,可建模为最小费用流:- 流:产品制造数量
- 费用:员工的愤怒值增量
- 约束:每个产品类别的总产量 = ,员工只能生产允许的产品类型
-
分段线性费用处理
对于员工 ,若其生产 件产品,总愤怒值为: [ f_i(x) = \sum_{j=1}^{S_i+1} \min(x - T_{i,j-1},\ T_{i,j} - T_{i,j-1})^+ \cdot W_{i,j} ] 其中 。
由于 递增,这个函数是凸的,因此可以在流网络中通过多条边表示。
网络流建模
节点设计
- 源点
- 产品类型节点
- 员工节点
- 员工分段节点:每个员工 拆成 个节点
- 汇点
边与容量/费用
- :容量 ,费用 (产品需求)
- :若 ,容量 ,费用 (员工可生产该产品)
- :容量 ,费用 (分段区间)
- :容量 ,费用 (汇点收集所有产品)
为什么这样建模正确
- 从 流出的总流量 = ,保证所有需求被满足
- 员工 生产的产品先进入 ,然后按费用从低到高的顺序填充分段节点
- 由于 递增,最小费用流会自动先使用便宜的分段,符合实际情况
- 分段容量限制确保不会在达到 之前使用更贵的分段
算法步骤
- 建图:按上述结构建立网络流图
- 运行最小费用最大流算法(如 SSP、Primal-Dual)
- 检查是否满流:若最大流 < ,则无解(但题目保证有解,因 分配总是可行)
- 输出总费用:即最小愤怒值之和
复杂度分析
- 节点数:()
- 边数:
- 使用基于 SPFA 的 SSP 算法或 Primal-Dual 算法,在这样规模的图上可行
样例验证
样例:
2 3 2 2 2 1 1 0 0 0 1 1 2 1 10 1 2 1 6建图解释:
- 员工1:可生产产品1,2;分段:[1-2]费用1,[3-∞]费用10
- 员工2:可生产产品3;分段:[1-2]费用1,[3-∞]费用6
最优分配:
- 员工1生产2件产品1 → 费用
- 员工1生产2件产品2 → 费用
- 员工2生产2件产品3 → 费用
总费用 = ?
等等,样例输出是 24,说明我理解有误。重新理解:
样例中员工1的分段是:第一段生产1~2件时每件费用1,之后每件费用10。
如果员工1生产4件,总费用 =
员工2生产2件,总费用 =
总和 = 24,符合输出。这说明费用是分段累计的,不是每件单独算。网络流建模时, 的费用设为 会让算法自动累加。
总结
这道题的核心是:
- 识别出最小费用流模型
- 利用凸分段线性函数的性质,通过多条边表示
- 正确设置容量和费用,使得流按费用从低到高使用分段
- 保证所有产品需求被满足(满流)
通过将实际问题转化为流网络,可以高效求出全局最优解。
- 1
信息
- ID
- 3773
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者