1. 程式人生 > >Codeforces 832C - Strange Radiation

Codeforces 832C - Strange Radiation

strong for turn col clas ati ack size space

832C - Strange Radiation

思路:二分最短時間。

代碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair 
#define pi acos(-1.0)
#define pii pair<int,int>
#define pil pair<int,long>
#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<n;i++) { if(a[i].t==1) {
if(a[i].x-(a[i].v+s)*t>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<r_l||r_r<l_l)return false;//取交集 return true; } int main() { scanf("%d%lf",&n,&s); for(int i=0;i<n;i++) scanf("%lf%lf%lf",&a[i].x,&a[i].v,&a[i].t); double l=0,r=1e6+5; double mid=(l+r)/2; while(r-l>=eps) { if(check(mid))r=mid; else l=mid; mid=(l+r)/2; } printf("%.12lf\n",mid); return 0; }

Codeforces 832C - Strange Radiation