二进制搜索/二分法的参与?

时间:2015-05-18 05:48:02

标签: c++ binary-search bisection

我正在从lightoj评委那里做this problem(抱歉给出了我不知道如何添加图片的链接)。这是基于纯几何的问题而我的appoarch是这导致了Accepted解决方案。< / p>

代码

  #include <bits/stdc++.h>
  using namespace std;
  int main() {

   int t,temp;
   cin>>t;
   temp=t;
   while(t--)
   {
    double ab,ac,bc,r;
    cin>>ab>>ac>>bc>>r;
    double sq=ab*sqrt((r/(r+1)*1.0));
    printf ("Case %d: %lf\n", temp-t,sq);
   }
    return 0;
 }

但问题是这个问题被标记为二进制搜索/二分法,我找不到用二进制搜索做到这一点的方法。我搜索网络知道如何做到但却找不到方法。可以有人帮我用二分搜索/二分法来帮助我这样做,我们可以应用二分/二元搜索(搜索除外)的一般问题是什么

1 个答案:

答案 0 :(得分:1)

使用类似的三角形,我们可以找到ADE / ABC比率的公式,涉及AD和AB。然后通过替换ABC = ADE + BDEC找到ADE / BDEC的比率是微不足道的。

我们知道AD的界限为0&lt; AD&lt; = AB。然后我们可以使用二分法来找出AD的哪个值满足上述区间中的比率。 (关于二分法的额外阅读:https://mat.iitm.ac.in/home/sryedida/public_html/caimna/transcendental/bracketing%20methods/bisection/bisection.html

除此之外,我们需要制定一个方程式,使得AD的精确解将产生方程的根。一个这样的等式是: f(x)= ratio_act - ratio_est

// ADE/ABC = (AD/BC)^2 (By similar triangles)
// ADE/BDEC = (AD^2)/(AB^2 - AD^2)
double bisection(double AB, double ratio_act)
{
    auto f = [](double AD_est, double AB, double ratio_act){ return ratio_act - ((AD_est* AD_est/(AB*AB - AD_est*AD_est)));};
    double b = AB +1, a = 0, ratio_est, AD_est;
    cout << f(a, AB, ratio_act) * f(b, AB, ratio_act) << endl;
    do {
        AD_est = (b+a)/2;
        // as per above formula
        ratio_est = f(AD_est, AB, ratio_act);
        if (ratio_est*f(a, AB, ratio_act) < 0) {
            b = AD_est;
        } else {
            a = AD_est;
        }
    } while (abs(ratio_est - ratio_act) <= 1e-9);
    return AD_est;
}