找到使用二进制搜索解决约束的特定立方根

时间:2016-03-31 11:20:43

标签: c++11 binary-search

我试图找到以下等式的立方根(t),约束

  

F(t)= A(t ^ 3)+ B(t ^ 2)+ C *(t)+ D,F(t)< = 10 ^ 18。
  帮助找到使得F(t + 1)> K和F(t)< = K

我尝试了以下方法;

我所做的是遵循二分搜索方法。实际上将t值设为k / 2。如果结果值大于k,我将尝试使用t值k / 4.Else如果结果小于k,我将检查t值k / 4。该程序似乎适用较小的k值,但问题是超过较大k的范围的值。我想我应该拾取一个更好的枢轴值(intiall值)或改变一些方程式

    int a,b,c,d;
    long long int k,x,y;
    long long int i,f,temp1;
    int def;

    def=0;
    cin>>a>>b>>c>>d>>k;
    i=1;
    f=k;
    temp1=(1+k)/2;
    while((temp1>=1)&&(temp1<=k))
    {
        x=a*(temp1+1)*(temp1+1)*(temp1+1)+b*(temp1+1)*(temp1+1)+c*(temp1+1)+d;
        y=a*(temp1)*(temp1)*(temp1)+b*temp1*temp1+c*temp1+d;
        if((x>k)&&(y<=k))
        {
            cout<<temp1<<endl;
            def=1;
            break;
    }
    else if(x<k)
    {
        i=temp1;
        temp1=(f+temp1)/2;

    }
    else if(x>k)
    {
        f=temp1;
        temp1=(i+temp1)/2;
    }

}
        if(def==0)
         cout<<def<<endl;
       return 0;
}

1 个答案:

答案 0 :(得分:0)

总是有可能遇到溢出,因为a, b, c, d的约束是动态的,即它们取决于用户。

但是,在进行二分查找时,您可以为要搜索的范围选择更好的结束值,但如果a,b,c,d的值很大,则可能还会出现溢出。

你的二进制搜索也太复杂了,我写了一个更简单的二进制搜索解决方案。

注意:如果a,b,c,d的值很大,则会出现溢出,因此您可能想要使用更好的结束范围来搜索t值,在我的示例中,我已经采取了它为1000000即k的立方根,因为其他值很小。

c ++中的代码:

#include <iostream>
using namespace std;

long long a, b, c, d, k;

long long F_t(int val){
    long long ans = (a*val*val*val) + (b*val*val) + (c*val) + d;
    return ans;
}

bool check(int mid){
    if(F_t(mid) <= k) return true;
    return false;
}

int main() {
    cin >> a >> b >> c >> d >> k;
    long long st = 1, en = 1000000, ans = 0;
    while(st <= en){
        long long mid = (st+en)/2LL;
        if(check(mid) == true){
            ans = max(ans, mid);
            st = mid+1;
        }else{
            en = mid-1;
        }
    }
    cout << ans << endl;
    return 0;
}

Ideone上的演示:http://ideone.com/4WlRuc

大整数库可能会有所帮助,因为它可以消除溢出的可能性,并始终使用上述算法提供正确的结果,您可以将范围的端点值设为k(即en = k),复杂性为O(log2(k))