Grakn Forces 2020 C. Discrete Acceleration (二分+模拟)
题意: 两个车相向而行,初始速度为1 ,当到达 a[i] 的位置的时候,速度就会+1,问什么时候回相遇
思虑:二分查找时间。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; const double eps=1e-7; int n,l; int a[N]; int check(double ti) { double dis1=0,t1=0; int s1=1; for(int i=1;i<=n+1;i++){ if(t1+double(a[i]-a[i-1])/(s1*1.0)>ti){ dis1+=(ti-t1)*(s1*1.0); break; } else{ t1+=double(a[i]-a[i-1])/(s1*1.0); s1++; dis1=a[i]; } } double t2=0,dis2=0; int s2=1; for(int i=n;i>=0;i--){ if(t2+double(a[i+1]-a[i])/(s2*1.0)>ti){ dis2+=(ti-t2)*(s2*1.0); break; } else{ t2+=double (a[i+1]-a[i])/(1.0*s2); s2++; dis2=l-a[i]; } } // cout<<"dis1 "<<dis1<<" "<<"dis2 "<<dis2<<endl; if(dis1+dis2>l) return 1; else return 0; } int main() { int t; cin>>t; while(t--) { cin>>n>>l; for(int i=1;i<=n;i++) cin>>a[i]; a[n+1]=l; a[0]=0; double l=0,r=1e9; while(r-l>eps) { double mid=(l+r)/(2*1.0); if(check(mid)==1) r=mid; else l=mid; } printf("%.8lf\n",l); } }