Binary search application

当时比赛想了二分,二分没用在刀刃上。我只对前缀和和tm的比较做了二分,而没有加t>=a+(mid-1)b 这个条件二分

当时二分了一个位置,然后从这里往后遍历到L来找maxR, 结果算法是错的。

适合做知道二分,但是写个bug free的 代码,不适合做应用

c1=t>=a+(mid-1)b, c2=sum[mid]-sum[L-1]<=tm,
这道题目, if(c1 && c2)l=mid else r=mid-1,

这种一开始写只从len=3开始规约,len=3->1,2, len=2->2,-1

结果发现有一个错了,后来发现len=4->1,3, 因此外部长度判断应该放到while(len>=1), 这里先入为主是因为看了kuangbin的代码影响。

所以规约应该最多要考虑到len=4在某些情况下例如此处。

附上代码:

LL sum[maxn];
int main()
{

#ifndef ONLINE_JUDGE
    //freopen ("in.txt" , "r" , stdin);
    //freopen ("out.txt" , "w" , stdout);
#endif

    LL a, b, n, l, t, m, L;
    while(cin>>a>>b>>n)
    {
        sum[0]=0;//sumi: A+...+A+(i-1)B
        for(int i=1;i<=maxn;i++) sum[i]=sum[i-1]+a+(i-1)*b;
        for(int i=0;i<n;i++)
        {
            cin>>L>>t>>m;
            int l=L,r=maxn;
            int ans=-1;
            while(l<=r)
            {
                if(l+1==r || l==r)
                {
                    //cout<<"l r:"<<l<<" "<<r<<endl;
                    if(t>=a+(r-1)*b && sum[r]-sum[L-1]<=t*m) ans=r;
                    else if(t>=a+(l-1)*b && sum[l]-sum[L-1]<=t*m) ans=l;
                    break;
                }
                int mid=(l+r)/2;
                if(t>=a+(mid-1)*b && sum[mid]-sum[L-1]<=t*m) l=mid;
                else r=mid-1;
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}

Posted by richard爱闹 - 4月 15 2015
如需转载,请注明: 本文来自 Richard