题意:
求Ax+Bsinx=C的解。
一开始,我高高兴兴的写了二分法:
虽然比较长,但是一发AC了。
#include <cstdio>
#include <cmath>
const double eps = 1e-9;
double A, B, C;
bool check(double x) {
if(A * x + B * sin(x) - C < eps) return 1;
return 0;
}
int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%lf%lf%lf", &A, &B, &C);
double l = 0.0, r = 100000.0;
while(r - l > eps) {
double mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
printf("%lf\n", l);
}
return 0;
}
我:我要报警 (´;ω;`) (´;ω;`)
牛顿:怪我咯?
我以为是迭代次数太少...迭代次数多了会TLE,少了会WA。
最后我发现是初值的问题。
取C/A迭代100次就AC了...就AC了...
(╯°Д°)╯︵ /(.□ . \)
#include <cstdio>
#include <cmath>
double A, B, C;
int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%lf%lf%lf", &A, &B, &C);
double ans = C / A;
for(int i = 1; i <= 100; i++)
ans = ans - (A * ans + B * sin(ans) - C) / (A + B * cos(ans));
printf("%lf\n", ans);
}
return 0;
}