• Acm群赛 Mengzhu 二分查找


    这题大概题意是这样的,给定log2(x + y) = A 以及 log2(x - y) = B,现在要求出log2(x)是多少。首先这题中给定的A、B的范围是骗人的,实际上A、B的差值不能够大于1024,否则就不能够使用pow函数,不知道这种方法是不是错了。

    首先有log2(x) = Min(A, B) - 1 + log2(2^|A-B|+1)那么我们就能够估计这个值的范围是[Min(A, B) - 1 + |A-B|, Min(A, B) + |A-B|],我们对log2(2^|A-B|)这个式子进行二分求值,最后得到结果。这题的二分真是诡异,明明最后边界L和MID的差值是小于10^-8的,但是最后只有返回L是正确的,不知道是为什么。

    代码如下:

    #include <cstdlib>
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #define eps 1e-8
    using namespace std;
    
    double A, B, diff, TEMP;
    double x, y;
    
    bool Ac(double x) {
        double mm = x - diff;
        if (TEMP*(pow(2, mm)-1) > 1) {
            return true;
        } else {
            return false;    
        }
    }
    
    double bsearch(double l, double r) {
        double mid;
        while (r - l > eps) {
            mid = (l + r) / 2.0;
            if (Ac(mid)) {
                r = mid - eps;
            } else {
                l = mid + eps;
            }
        }
        return l;
    }
    
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            scanf("%lf %lf", &A, &B);
            diff = fabs(A - B);
            TEMP = pow(2, diff);
            printf("%.5lf\n", bsearch(diff, diff + 1) + min(A, B) - 1);
        }
        return 0;    
    }
  • 相关阅读:
    Block的强强引用问题(循环引用)
    自己封装的下载方法
    MJRefresh上拉刷新下拉加载
    JavaScript 模块的循环加载
    webpack使用require注意事项
    console.log高级用法
    path.resolve()和path.join()的区别
    深入理解react
    react children技巧总结
    揭秘css
  • 原文地址:https://www.cnblogs.com/Lyush/p/2766962.html
Copyright © 2020-2023  润新知