【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t083
【题解】
可以看一下;
钱数很小;
最大才10000;
即使每张票都是1元;
最多也只能买10000张票;
于是考虑二分最后连续的票数m;
如果存在连续m张票的和小于等于f;
就增大m;否则减小m;
这里判断有没有m张票的和小于等于f需要趋近于O(N)的复杂度;
所以最坏就是
O(log2(f)*N)吧.
实际情况更好一点吧。因为过了;
【完整代码】
#include <cstdio>
#include <algorithm>
using namespace std;
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)
const int MAXN = 1e6;
int n,f;
int a[MAXN],pre[MAXN];
bool ok(int num)
{
for (int l = 1,r = num;r<=n;l++,r++)
{
int t = pre[r]-pre[l-1];
if (t<=f)
return true;
}
return false;
}
int main()
{
//freopen("F:\rush.txt","r",stdin);
rei(n);rei(f);
rep1(i,1,n)
{
rei(a[i]);
pre[i] = pre[i-1]+a[i];
}
int l = 0,r = min(f,n),ans = 0;
while (l <= r)
{
int m = (l+r)>>1;
if (ok(m))
{
ans = m;
l = m+1;
}
else
r = m-1;
}
printf("%d
",ans);
return 0;
}