标签:
把(d2,0)代入第二个方程可以得到一个方程:经过(d2,0)的抛物线的起点的方程
再把它和第一个方程联立,就能解出两条抛物线的交点,再验算:是否在0~d2范围内,是否在x=d1时会撞到building2
注意可能不需要滑行就能到达(d2,0),先特殊处理这种情况
一开始傻逼理解错题意,后来一直修改又去考虑了不会出现的情况,例如A=0,delta<0,最后才发现了我忘记打sqrt了!!!
这场比赛题略难...就不会做 当时还是比较慌,很怕过不了题,加上自己思考的没有深度...E题挂了好几发
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> using namespace std; const double eps = 1e-10; double h1, h2, d1, d2, a, b; bool check(double x) { double y = b*(d2-x)*(d2-x); if(x < 0 || x > d2) return false; if(x > d1 && h1-a*d1*d1 > h2-eps) return true; else if(y-b*(d1-x)*(d1-x) > h2-eps) return true; return false; } int main() { #ifdef LOCAL freopen("E.in", "r", stdin); #endif while(cin >> h1 >> h2 >> d1 >> d2 >> a >> b) { //do not glide if(abs(h1-a*d2*d2) < eps && h1-a*d1*d1 > h2-eps) { cout << "Yes" << endl; continue; } //glide once double A, B, C, delta; A = (b+a); B = -2*b*d2; C = b*d2*d2-h1; delta = B*B-4*A*C; if(delta < 0) { cout << "No" << endl; continue; } double x1 = ((-B)+sqrt(delta))/(2*A), x2 = ((-B-sqrt(delta)))/2/A; if(check(x1) || check(x2)) { cout << "Yes" << endl; continue; } cout << "No" << endl; } return 0; }
UESTC 2014 Summer Training #11 Div.2
标签:
原文地址:http://www.cnblogs.com/gemmeg/p/3871033.html