链接:Ural - 1753
题意:书架高为 h ,长为 L,书本高为 H。现将书本向左倾斜,向右滑动,问书本顶端对书架左端重锤线的最大偏离距离是多少。
思路:书本滑动时,可以看到,偏离距离会先增大再减小,是一条单峰曲线。所以要根据对应数学关系先求出曲线函数,然后进行三分求最大值。注意浮点数的比较。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
double eps=1e-8;
int h,H,L;
double f(double x)
{
return ((H/2.0*x)/sqrt(x*x+h*h) - x);
}
int main()
{
cin>>h>>H>>L;
double l = 0,r = H;
while(r - l >= eps)
{
double m = (l+r)/2.0;
double mm = (m+r)/2.0;
double ans1 = f(m);
double ans2 = f(mm);
if(ans1 > ans2) r = mm;
else l = m;
}
int ansm = (l+r)/2;
cout<<fixed<<setprecision(6)<<f(l)<<endl;
return 0;
}