读书时间
发布时间: 2018年4月17日 19:40 时间限制: 1000ms 内存限制: 128M
描述
小A刚度过一段繁忙的时期,终于有空闲的时间来读(wan)书(shua)了。今天,他有t分钟的空闲时间来读书。因此,他跑到了图书馆开始他的读书大计。图书馆中有n本书,编号从1~n,小A读完每本书所花的时间为ai分钟。
小A决定从随机的一本书开始读,然后一本接一本的读下去。比如,假设小A决定从第i本书开始读,那么他的读书顺序编号就是i+1,i+2...如果他把自己的空闲时间花光了,那他就不会再读下去了。所以,小A想请你帮他确定一下读的第一本书的编号,使得他所能读完的书的本数最大(若最后一本书他读不完,则这本书不能算进去),输出他所能读的书本数的最大值。
输入
第一行包含两个整数n,t(1<=n<=10^5,1<=t<=10^9)——n表示图书馆的书本数,t表示小A的空闲时间(分钟)。
第二行包含n个整数a1,a2,...,an(1<=ai<=10^4),ai表示小A读完第i本书所需时间(分钟)。
输出
输出一个整数,表示小A所能读的书本数的最大值。
样例输入1
4 5 3 1 2 1
样例输出1
3
———————————————————————————————————————————————————
没时间了..没做完 上标程分析吧:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int n,t;
int a[100010];
while(scanf("%d%d",&n,&t)!=EOF)
{
int i;
a[0]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=a[i-1]+a[i];
}//保存基值
int maxn=0;
for(i=1;i<=n;i++)
{
int l=1,r=i,mid;
if(t>=a[i])
{
maxn=max(maxn,i);
continue;
}//时间足够时
while(l<r)
{
mid=l+r>>1;//???
if(t<a[i]-a[mid])
l=mid+1;
else
r=mid;
}
maxn=max(maxn,i-l);
}//真没看懂
printf("%d\n",maxn);
}
return 0;
}