C++11 使用二进制搜索查找解决约束的特定立方根

C++11 使用二进制搜索查找解决约束的特定立方根,c++11,binary-search,C++11,Binary Search,我试图为下面的等式,约束找到一个立方根(t) F(t)=A(t^3)+B(t^2)+C*(t)+D,F(t)K和F(t)>A>>B>>C>>D>>K; i=1; f=k; temp1=(1+k)/2; 虽然((temp1>=1)和&(temp1k)和&(y总是有可能出现溢出,因为a、b、c、d的约束是动态的,即它们取决于用户 但在进行二进制搜索时,可以为要搜索的范围选择更好的结束值,但如果a、b、c、d的值较大,则也可能会出现溢出 另外,你的二进制搜索太复杂了,我已经写了一个更简单的二进制搜索解

我试图为下面的等式,约束找到一个立方根(t)

F(t)=A(t^3)+B(t^2)+C*(t)+D,F(t)K和F(t)>A>>B>>C>>D>>K; i=1; f=k; temp1=(1+k)/2;
虽然((temp1>=1)和&(temp1k)和&(y总是有可能出现溢出,因为
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;
}
#包括
使用名称空间std;
长a,b,c,d,k;
长-长F_t(int-val){
long-long-ans=(a*val*val*val)+(b*val*val)+(c*val)+d;
返回ans;
}
布尔检查(int mid){
如果(F_t(mid)>a>>b>>c>>d>>k;
长st=1,en=1000000,ans=0;

然而,我认为你的解决方案在这里行不通。我觉得在这里应用二进制搜索没有任何意义。我建议用牛顿的方法来找到F(t)-K的根,并检查哪个根满足要求。谢谢@Rishit,我的实际意图是使用二进制搜索,而不是求解方程。
#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;
}