#dDDLDPlydlt50x5902. 裁剪序列 Cut the Sequence
裁剪序列 Cut the Sequence
题目描述
给定一个长度为 的非负整数序列 。要求把该序列分成若干连续段,使得每一段内所有数之和不超过 ,并且使得各段内的最大值之和最小。
试计算这个最小值。
输入格式
- 第一行两个整数 和 。
- 第二行 个整数,表示序列 。
输出格式
- 一个整数,表示最小的“每段内最大值之和”。
- 如果无法按条件分段(例如某一段一个数就大于 ),则输出 。
数据范围
- (非负整数)
输入样例
8 17
2 2 2 8 1 8 2 1
输出样例
12
样例解释
序列:
我们需要将序列分成若干连续段,每段和 ,并使各段的最大值之和最小。
一种可行的划分:
- 第 1 段:
和 ,最大值是 。 - 第 2 段:
和 ,最大值是 。
总和 。
但 16 不是最优。
尝试更优划分:
- 第 1 段:
和 ,最大值是 。 - 第 2 段:
和 ,最大值是 。 - 第 3 段:
和 ,最大值是 。
总和 。
12 比 16 更小,且各段和都不超过 17。
事实上,12 是最小值(可以验证没有更小的方案)。
为什么不是更小?
例如如果想让第 2 段的最大值变小,必须把两个 8 分开,但分开后可能使得其他段的和超过 17,或者段数变多导致总和变大。
最优策略是尽量让大的数单独成段,或者与比它小的数一起成段,以减少对后续段的影响,同时保证每段和不超限。
输出: