zoukankan      html  css  js  c++  java
  • 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;    
    }
  • 相关阅读:
    (转)python request用法
    QLabel 文本内容自动换行显示
    事件的传递 键盘事件作为例子
    qt中添加Q_OBJECT报错的问题
    Q_OBJECT宏的作用
    C++中的RAII介绍 资源管理
    C++ explicit关键字详解
    信号和槽 带不带参数
    enum 枚举类型默认值
    创建工具条ToolBar
  • 原文地址:https://www.cnblogs.com/Lyush/p/2766962.html
Copyright © 2011-2022 走看看