没什么可说的,记录一下写法,以及long double这种精度
引用自兰子大佬
很容易发现左边是一个单调增的函数,所以二分求解即可。值得注意的是如果用double可能出现tle的情况(实测double精度有问题,导致后面无限不动)。解决方法有两种,一种是换long double,另外一种是进行足够多次二分即可(例如1000次二分),可以避免tle的出现。
青竹大佬的
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7, mod = 1e9 + 7; const double eps = 1e-8; typedef long long ll; double a, b, c; bool check(double x) { return pow(x, a) + b * (log(x)) >= c; } int main() { scanf("%lf%lf%lf", &a, &b, &c); double left = 0, right = 1e9, ans = -1; while (right - left > eps) { double mid = (left + right) / 2; if(mid - left < eps) { ans = left; break; } if(check(mid)){ right = mid; } else left = mid; } printf("%.8f\n", ans); }
兰子大佬的
#include <bits/stdc++.h> using namespace std; #define ld long double int a; ld b, c; ld bs(ld l, ld r) { if (r - l <= 1e-8) return l; ld mid = (r + l) / 2; ld res = 1; for (int i = 0; i < a; i++) res *= mid; res += b * log(mid); if (res < c) return bs(mid, r); return bs(l, mid); } int main() { cin >> a >> b >> c; printf("%.7Lf", bs(1, c)); }