C++11 使用二进制搜索查找解决约束的特定立方根
我试图为下面的等式,约束找到一个立方根(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;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的值较大,则也可能会出现溢出 另外,你的二进制搜索太复杂了,我已经写了一个更简单的二进制搜索解
虽然((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;
}