题目描述
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
| Inputcopy | Outputcopy |
|---|---|
4 5 3 1 2 1 |
3 |
Sample 2
| Inputcopy | Outputcopy |
|---|---|
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; }
浙公网安备 33010602011771号