清北学堂模拟赛d3t5 c

分析:其实就是一道数学题.如果以左下角的点为原点建立平面直角坐标系,那么点(b,a)是最容易卡住棺材的.我们求出棺材左边到点(b,a)的距离最小值,只有w小于等于这个最小值才能被拉过去.那么先求出左面这条直线的函数解析式,利用点到直线的距离公式,可以求得距离.不过因为有两个未知数,我们需要枚举其中一个未知数,观察得到这是一个单峰函数,利用三分法就能解决了.

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

using namespace std;

int a, b, l;

double check(double v1)
{
    double v2 = sqrt(l * l - v1 * v1);
    if (a * v1 + b * v2 < v1 * v2)
        return -1e+20;
    return (a*v1 + b * v2 - v1 * v2) / l;
}

int main()
{
    scanf("%d%d%d", &a, &b, &l);
    if (a >= l && b >= l)
        printf("%d.0000000\n", l);
    else
        if (a >= l)
            printf("%d.0000000\n", b);
        else
        if (b >= l)
            printf("%d.0000000\n", a);
        else
        {
            double l0 = 0.0, r0 = l;
            for (int i = 1; i <= 100; i++)
            {
                double m1 = (r0 - l0) / 3.0 + l0;
                double m2 = (r0 - l0) / 3.0 * 2+ l0;
                if (check(m1) < 0.0 || check(m2) < 0.0)
                {
                    printf("My poor head =(\n");
                        return 0;
                }
                if (check(m1) < check(m2))
                    r0 = m2;
                else
                    l0 = m1;
            }
            printf("%.7lf\n", check(r0));
        }

    return 0;
}

 

posted @ 2017-10-05 13:11  zbtrs  阅读(271)  评论(0编辑  收藏  举报