计算几何 ural 1753

题意:求book在下滑过程中,中心距书架左边栏最远距离。

思路:刚开始并没有思路,只是简单的推出:在最开始的时候,book的中心距书架左边栏的距离(简称最左边距)为0,当book的中心与书架左边栏顶部重合时,最左边距也为0.那么最左边距的最大值肯定在这之间产生。搜了别人的题解,了解到三分法。至于什么是三分法,我也是刚了解,只知道,单峰函数三分法,函数在给定定义域内有不超过一个的峰值,可以根据其单峰特性来三分逼近答案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

#define eps 1e-8

int main()
{
    double h, H, l;
    scanf("%lf %lf %lf", &h, &H, &l);
    H /= 2;
    double left, right, tmp, mid1, mid2, ans1, ans2;
    left = eps;
    tmp = sqrt(H*H - h*h);
    if (tmp <= l)
        right = tmp;
    else
        right = l;
    while (fabs(right - left) > eps) {
        mid1 = (left + right) / 2;
        mid2 = (left + mid1) / 2;
        ans1 = mid1*H/sqrt(mid1*mid1+h*h) - mid1;
        ans2 = mid2*H/sqrt(mid2*mid2+h*h) - mid2;
        if (ans1 > ans2)
            left = mid2;
        else
            right = mid1;
    }
    printf("%.6lf\n", ans1);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值