#dDDLDPybttg050507. 1603:绿色通道

1603:绿色通道

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

高二数学《绿色通道》总共有 nn 道题目要抄,编号 1n1 \dots n,抄第 ii 题要花 aia_i 分钟。小 Y 决定只用不超过 tt 分钟抄这个,因此必然有空着的题。每道题要么不写,要么抄完,不能写一半。下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。

现在,小 Y 想知道他在这 tt 分钟内写哪些题,才能够尽量减轻马老师的怒火。由于小 Y 很聪明,你只要告诉他最长的空题段至少有多长就可以了,不需输出方案。


输入格式

第一行为两个整数 n,tn, t

第二行为 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n,表示抄每道题所需的时间。


输出格式

输出一个整数,表示最长的空题段至少有多长。


样例

样例输入

17 11
6 4 5 2 5 3 4 5 2 3 4 5 2 3 6 3 5

样例输出

3

样例说明

n=17,t=11n=17, t=11,题目时间如上表。

在不超过 1111 分钟的情况下,小 Y 可以选择抄部分题目,使得最长连续空题段长度尽量小。

输出为 33,表示存在一种选择,使得最长空题段长度不超过 33,且总时间不超过 1111 分钟。

表格中给出了一种方案(“是否空题”一行中,√ 表示空题,空白表示抄题)。
最长连续空题段长度为 33(例如第 1133 题都空,或第 991111 题都空,等等)。


数据范围

  • 对于 60%60\% 的数据,n2000n \le 2000
  • 对于所有数据,$0 < n \le 5\times 10^4, 0 < a_i \le 3000, 0 < t \le 10^8$。

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 二分答案 + 单调队列优化 DP 问题。

问题转化
设最长空题段长度不超过 lenlen,问是否存在一种选择方案,使得总时间不超过 tt

如果我们能快速判断对于给定的 lenlen 是否可行,那么就可以通过二分 lenlen 来找到最小的可行 lenlen

判断方法(给定 lenlen):
此时要求任意连续 len+1len+1 道题中至少选一道(因为如果连续 len+1len+1 道题都不选,则空题段长度为 len+1>lenlen+1 > len,不满足要求)。
因此问题变为:在“任意连续 len+1len+1 题至少选一道”的限制下,选择一些题目,使总时间最小。

dp[i]dp[i] 表示前 ii 题,且ii 题必须选的最小总时间。

转移方程:

dp[i]=ai+minj=ilen1i1dp[j]dp[i] = a_i + \min_{j=i-len-1}^{i-1} dp[j]

其中 jj 的范围是因为第 ii 题选,上一道选的题必须在 [ilen1,i1][i-len-1, i-1] 之间,否则中间空题段会超过 lenlen

初始条件:
可以设虚拟的第 00 题,dp[0]=0dp[0]=0

最终的最小总时间是 minj=nlenndp[j]\min_{j=n-len}^{n} dp[j](因为最后一段空题段也不能超过 lenlen,所以最后一道选的题必须在 [nlen,n][n-len, n] 之间)。

这个最小总时间如果 t\le t,则 lenlen 可行。

优化
minj=ilen1i1dp[j]\min_{j=i-len-1}^{i-1} dp[j] 可以用 单调队列 维护滑动窗口最小值。

二分答案

  • 下界 l=0l=0(可以一题不空?但至少有一题空,所以可能从 00 开始);
  • 上界 r=nr=n(全空);
  • 二分 midmid,判断是否可行,可行则 r=midr=mid,否则 l=mid+1l=mid+1

复杂度:O(nlogn)O(n \log n)

注意:当 lennlen \ge n 时,可以一题不选,总时间为 00,肯定可行。
len=0len=0 时,必须每道题都选,总时间为 ai\sum a_i,若 ait\sum a_i \le t 则可行,否则不可行。