思路:二分最短时间。
代码:
#includeusing namespace std;#define ll long long#define pb push_back#define mp make_pair #define pi acos(-1.0)#define pii pair #define pil pair #define mem(a,b) mamset(a,b,sizeof(a))const int MOD=1e9+7;const int INF=0x3f3f3f3f;const int N=1e5+5;const double eps=1e-9;int n;double s;struct people{ double x,v,t;}a[N];bool check(double t){ bool flag1=false,flag2=false; double l_l=1e6,l_r=0,r_l=1e6,r_r=0; for(int i=0;i 0)continue;//如果炸弹放在这个点上都到不了,说明这个人肯定到不了。 flag1=true; if(a[i].x-a[i].v*t<=0)//如果不加速也能到,那说明炸弹放在哪里都可以。 { l_l=0; l_r=1e6; continue; } double X=floor((t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s); l_r=max(l_r,X);//取并集 l_l=min(l_l,(double)a[i].x); } else if(a[i].t==2) { if(a[i].x+(a[i].v+s)*t<1e6)continue; flag2=true; if(a[i].x+a[i].v*t>=1e6) { r_l=0; r_r=1e6; continue; } double X=ceil((1e6*(s-a[i].v)-t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s); r_l=min(r_l,X); r_r=max(r_r,(double)a[i].x); } } if(!flag1||!flag2)return false; if(l_l>l_r||r_l>r_r)return false; if(l_r =eps) { if(check(mid))r=mid; else l=mid; mid=(l+r)/2; } printf("%.12lf\n",mid); return 0;}