清北学堂模拟赛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; }