没什么可说的,记录一下写法,以及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));
} 
京公网安备 11010502036488号