本题练习二分。
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2015
非常简单。
只要推出公式:设墙之间距离为m
double u1 = sqrt(y * y - m * m);
double u2 = sqrt(x * x - m* m);
double t = c * (u1 + u2) - u1* u2;
以上方程很容易列出来。当t逼近于0时.m就是符合要求的解。很容易观察此方程是单调的。可用二分法。
注意:求t逼近于0时。使用1e-6即可。再小就超时了。我就是刚开始开了1e-10,然后改成1e-8,然后一直TLE。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
double x,y,c;
int calc(double m)
{
double u1 = sqrt(y * y - m * m);
double u2 = sqrt(x * x - m* m);
double t = c * (u1 + u2) - u1* u2;
if(t < 0)
{
return -1;
}
else if(t <= 1e-6)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
double l,r;
double m;
int val;
while(scanf(" %lf %lf %lf",&x,&y,&c) == 3)
{
m = 0;
l = 0;
if(x < y)
{
r = x;
}
else
{
r = y;
}
while(l<=r)
{
m = (l + r)/2;
val = calc(m);
if(val == 0)
{
break;
}
else if(val < 0)
{
l = m;
}
else
{
r = m;
}
}
printf("%.3f\n",m);
}
return 0;
}