当瓦莱拉有空闲时间时,他会去图书馆看书。今天他有 t t t 分钟的空闲时间看书。因此,瓦莱拉在图书馆借了 n n n 本书,并为每本书估算了阅读所需的时间。让我们用 1 1 1 到 n n n 之间的整数为这些书编号。瓦莱拉需要 a i a_i ai 分钟来阅读第 i i i 本图书。
瓦莱拉决定任意选择一本编号为 i i i 的书,从这本书开始逐本阅读。换句话说,他将首先阅读编号为 i i i 的书,然后阅读编号为 i + 1 i + 1 i + 1 的书,接着阅读编号为 i + 2 i + 2 i + 2 的书,以此类推。他将继续这个过程,直到用完空闲时间或读完第 n n n 本书。瓦莱拉会把每本书读完,也就是说,如果他没有足够的空闲时间读完这本书,他就不会开始读这本书。
请打印瓦勒拉最多可以阅读的书籍数量。
输入
第一行包含两个整数
n
n
n 和
t
t
t 。
(
1
≤
n
≤
1
0
5
;
1
≤
t
≤
1
0
9
)
(1 ≤ n ≤ 10^5; 1 ≤ t ≤ 10^9)
(1 ≤ n ≤ 105;1 ≤ t ≤ 109) - 瓦莱拉的书籍数量和空闲分钟数。第二行包含一串
n
n
n 个整数
a
1
,
a
2
,
.
.
.
,
a
n
(
1
≤
a
i
≤
1
0
4
)
。
(
1
≤
a
i
≤
1
0
4
)
a_1, a_2, ..., a_n (1 ≤ a_i ≤ 10^4) 。 (1 ≤ a_i ≤ 10^4)
a1, a2, ..., an(1 ≤ ai ≤ 104)。(1 ≤ ai ≤ 104) ,其中数字
a
i
a_i
ai 表示男孩阅读第
i
i
i 本图书所需的分钟数。
输出
打印一个整数–瓦莉拉最多可阅读的书籍数量。
双指针算法使用的条件是有序性,这里的有序不是数组元素的从小到大,而是操作时的有序性。
对于这道题而言,有序性指的是Valera在读书的时候必须从当前选择的书往后读,直到不能够再读或者到头了。
双指针:使用 i i i 代表开始读的那本书, j j j 代表读到最后的那本书,维护 s u m sum sum 为读这些书的总时间,在 i i i 后移之后, s u m sum sum 要减去 i − 1 i-1 i−1 的那本书所需要的时间,然后再 j j j 后移直到能够用完所有的时间。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+10;
int a[N];
int main(){
int n,t;cin >> n >> t;
for(int i = 1;i <= n;i++)cin >> a[i];
int sum = 0;
int ans = 0;
int pointer = 0;
for(int i = 1,j = 1;i <= n;i++){
if(i != 1)sum -= a[i-1];
while(sum + a[j] <= t && j <= n){
sum += a[j];
pointer = j;//由于直接控制j不好操作,故多取一个变量来存j的位置
j++;
}
ans = max(ans,pointer - i + 1);
}
cout << ans << endl;
return 0;
}