aciman

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目描述

xyb刚度过一段繁忙的时期,终于有空闲的时间来读(wan)书(shua)了。今天,他有t分钟的空闲时间来读书。因此,他跑到了图书馆开始他的读书大计。图书馆中有n本书,编号从1~n,xyb读完每本书所花的时间为ai分钟。

xyb决定从随机的一本书开始读,然后一本接一本的读下去。比如,假设xyb决定从第i本书开始读,那么他的读书顺序编号就是i+1,i+2...如果他把自己的空闲时间花光了,那他就不会再读下去了。所以,xyb想请你帮他确定一下读的第一本书的编号,使得他所能读完的书的本数最大(若最后一本书他读不完,则这本书不能算进去),输出他所能读的书本数的最大值。

输入描述

第一行包含两个整数n,t(1<=n<=10^5,1<=t<=10^9)——n表示图书馆的书本数,t表示xyb的空闲时间(分钟)。

第二行包含n个整数a1,a2,...,an(1<=ai<=10^4),ai表示xyb读完第i本书所需时间(分钟)。

输出描述

输出一个整数,表示xyb所能读的书本数的最大值。

Sample 1

InputcopyOutputcopy
4 5
3 1 2 1
3


Sample 2

InputcopyOutputcopy
3 3
2 2 3
1

 

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <algorithm> using namespace std; int a[100010]; int main() { int n,t; cin>>n>>t; a[0]=0; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]=a[i-1]+a[i];//前缀和 } int m=0; for(int i=1;i<=n;i++) { if(t>=a[i]) { m=max(m,i); continue; } int l=1,r=i,mid; while(l<r) { mid=l+r>>1; if (t >= a[i] - a[mid]) r = mid ; else l=mid-1;//二分,找出小于等于t的最大差值 } m=max(m,i-l); } cout<<m<<endl;//一定要输出换行 不换行过不了 return 0; }

 

posted on 2022-04-26 20:59  Aciman__之之  阅读(116)  评论(0)    收藏  举报