1. 程式人生 > >清北學堂模擬賽d3t5 c

清北學堂模擬賽d3t5 c

code 利用 三分 || http sin 卡住 ring 未知數

技術分享

技術分享

分析:其實就是一道數學題.如果以左下角的點為原點建立平面直角坐標系,那麽點(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; }

清北學堂模擬賽d3t5 c