The Meeting Place Cannot Be Changed CodeForces
阿新 • • 發佈:2019-01-01
先對人的座標升序排個序,二分時間即可,check函式的話就是判斷一下mid時間內能否到,先假設全部人往右走mid時間,求出往右走到達的位置的最小值tmp1,然後取最右的人的座標和tmp1比較,1.若該座標大於tmp1,說明該人及其右邊的人往右邊走是到不了tmp1的。2.若該座標小於等於tmp1,說明了全部人都可以在mid時刻內到達tmp1位置,直接就return true。對於第一種情況還要繼續判斷座標大於tmp1的人往左走能 不能到達tmp1.
#include<bits/stdc++.h> using namespace std; const int inf=2e9; #define eps 1e-7 struct node { int x,v; }p[60000+10]; int n; bool cmp(const node&a,const node&b) { return a.x<b.x; } bool check(double mid) { double tmp1=inf,tmp2=-inf; for(int i=1;i<=n;i++) tmp1=min(tmp1,p[i].x*1.0+p[i].v*mid); if(p[n].x<=tmp1) return true; int pos; for(int i=1;i<=n;i++) if(p[i].x>tmp1) { pos=i; break; } for(int i=pos;i<=n;i++) tmp2=max(tmp2,p[i].x*1.0-p[i].v*mid); if(tmp2<=tmp1) return true; else return false; } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>p[i].x; for(int i=1;i<=n;i++) cin>>p[i].v; sort(p+1,p+n+1,cmp); double low=0,up=inf,mid,ans; while(fabs(low-up)>=eps) { mid=(low+up)/2; if(check(mid)) { ans=mid; up=mid; } else low=mid; } printf("%.12lf\n",ans); return 0; }