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; }