检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
给定一个长度为 的序列,你有一次机会选中一段连续的长度不超过 的区间,将里面所有数字全部修改为 。请找到最长的一段连续区间,使得该区间内所有数字之和不超过 。
#输入格式
输入的第一行包含三个整数,分别代表 。
第二行包含 个整数,第 个整数代表序列中第 个数 。
#输出格式
包含一行一个整数,即修改后能找到的最长的符合条件的区间的长度。
#输入输出样例
样例输入 #1
9 7 2
3 4 1 9 4 1 7 1 3
样例输出 #1
5
#数据范围与约定
对于 的数据,,,。
#思路
单调队列 + 双指针。
由题:
你有一次机会选中一段连续的长度不超过 的区间,将里面所有数字全部修改为 。
可知答案的最小值为 ,因为其区间和为 ,一定不大于 。
如果有一个确定的区间 ,显然删掉这个区间里长度不超过 且和最大的子区间之后,区间和会最小。那么就有了一个 的算法:枚举 ,选择其中和最大的长度为 的区间,然后判断剩余元素的和是否 。
考虑优化,发现可以使用双指针算法。先令 ,然后从 开始向后查找,直到删去区间内长度为 且和最大的子区间后剩余的区间和 时停止查找,此时将答案与 取最大值即可。此时复杂度为 。
考虑继续优化,发现可以使用前缀和优化求和的复杂度。设 表示 区间内所有元素的和, 表示 区间内所有元素的和。这样就可以省去了求和的时间,最终时间复杂度为 。
#代码
1 |
|