HDU 5515 Game of Flying Circus

来源:互联网 发布:烈焰遮天 源码 双端 编辑:程序博客网 时间:2024/06/03 14:27

翻译&题解:

http://blog.csdn.net/snowy_smile/article/details/49535301 

代码:

#include <bits/stdc++.h>using namespace std;const double eps=1e-8;double t,v1,v2;bool solve(){    double le=0,ri=300,mid;    if(v1==v2) return 1;    if(v1*v1*2>v2*v2){//2 #3 未达到 1 需 #3 #4        while(le+eps<ri){            mid=(le+ri)/2;            double way1=sqrt(300*300+mid*mid);            double way2=300+mid;            if(way1/v1>way2/v2){                le=mid+eps;            }else{                ri=mid;            }        }        //计算谁先到 #4        double t1=(le+600)/v1;        double t2=(600-le)/v2+t;        if(t1>t2) return 0;        return 1;    }else if(3*v1>v2){//2 #3 已达到 #4 未达到 1 需 #4 #1        while(le+eps<ri){            mid=(le+ri)/2;            double way1=sqrt(300*300+(300-mid)*(300-mid));            double way2=600+mid;            if(way1/v1>way2/v2){                le=mid+eps;            }else{                ri=mid;            }        }        //计算谁先到 #1        double t1=(900+sqrt(le*le+300*300))/v1;        double t2=(600-le)/v2+t;        if(t1>t2) return 0;        return 1;    }else return 0;}int main(){    int T;    scanf("%d",&T);    for(int Case=1;Case<=T;Case++){        scanf("%lf%lf%lf",&t,&v1,&v2);        printf("Case #%d: %s\n",Case,solve()==1?"Yes":"No");    }}