【t083】买票

这里写图片描述
【题目链接】: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;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626690.html