Codeforces Round 171 (Div. 2) B. Books (双指针)

当瓦莱拉有空闲时间时,他会去图书馆看书。今天他有 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 i1 的那本书所需要的时间,然后再 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;
}
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值