首页 > 代码库 > UESTC 2014 Summer Training #11 Div.2

UESTC 2014 Summer Training #11 Div.2

E - Prototype  ZOJ 3235

  把(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