读书好多读书读好书(技巧题,水)

来源:互联网 发布:手机看本子的软件 编辑:程序博客网 时间:2024/05/01 18:54

题目来源:https://www.jisuanke.com/contest/753
【题意、代码】
给出一个时间t,有n本书,各自拥有一个时间耗费值,并且,如果,选定一本i书开始看,那么之后依次看i+1,i+2。。。
问有限的时间内最多看几本书。
思路就是预处理前缀和,从最开始开始遍历,依次把前缀和加上t,二分查找他们的和处在前几项和,依次更新maxx值。
【代码】

#include<set>#include<map>#include<stack>#include<cmath>#include<queue>#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<limits.h>#include<algorithm>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const int mod=1e4;typedef unsigned long long ll;typedef long long LL;LL a[100000+10];int E_F(int l,int r,LL x){    while(l<r)    {        int mid=(l+r+1)/2;        if(a[mid]>x)            r=mid-1;        else if(a[mid]<x)            l=mid;        else            return mid;    }    return l;}int main(){    int n;    LL t;    while(~scanf("%d%lld",&n,&t))    {    mem(a,0);       for(int i=1;i<=n;i++)       {           scanf("%lld",&a[i]);           a[i]+=a[i-1];       }       int maxx=0;       for(int i=0;i<n;i++)       {           LL sum=t+a[i];           int pos=E_F(0,n,sum);           if(pos-i>maxx)            maxx=pos-i;       }       printf("%d\n",maxx);    }}