【t083】买票

来源:互联网 发布:java短信发送验证代码 编辑:程序博客网 时间:2024/05/02 00:34

这里写图片描述
【题目链接】: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\n",ans);    return 0;}
0 0
原创粉丝点击