CodeForces 703C Chris and Road
生活随笔
收集整理的這篇文章主要介紹了
CodeForces 703C Chris and Road
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數學,遞推。
不知道有沒有更加神奇的做法,我是這樣想的:
首先,如果多邊形完全在$y$軸左側,那么答案為$\frac{w}{u}$。
剩下的情況就要先判斷是否能在車開過之前跑過去,如果跑不過去,要在車慢慢開過$y$軸的時候,一起慢慢跑上去。
那么先來判斷是否能在車開過之前跑過去:
如上圖所示,如果要在車來車前跑過去,那么等價于要求:對于凸包左側藍色鏈上的每一個點$L[i]$,滿足$\frac{{L[i].y}}{u} ≤ \frac{{L[i].x}}{v}$,即人要比點先到。如果有一個點不滿足,那么就人就無法在車來前跑過去。如果可以的話,答案為$\frac{w}{u}$。
剩下的情況就是凸包右側黃色鏈開過$y$軸時,人同時走上去。這種情況的答案,遞推一下就能算出來了,如果人走到$(0,R[i].y)$所花的時間為$ans$,那么人走到$(0,R[i+1].y)$的時間$ans$更新為$\max (ans + \frac{{\left( {R\left[ {i + 1} \right].y-R\left[ i \right].y } \right)}}{u},\frac{{R[i].x}}{v})$,想一想也能想明白吧~
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() {freopen("D:\\in.txt","r",stdin);freopen("D:\\out.txt","w",stdout); }const int INF=2000000000; const int maxn=10010; int n,w,v,u,len1,len2; struct X { int x,y; }p[maxn],L[maxn],R[maxn];int main() {scanf("%d%d%d%d",&n,&w,&v,&u);for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);int ymin=INF,ymax=-INF,f,p1,p2; bool flag;for(int i=1;i<=n;i++) ymin=min(ymin,p[i].y), ymax=max(ymax,p[i].y);f=INF; for(int i=1;i<=n;i++) if(p[i].y==ymin&&p[i].x<f) f=p[i].x,p1=i;f=INF; for(int i=1;i<=n;i++) if(p[i].y==ymax&&p[i].x<f) f=p[i].x,p2=i;flag=0; for(int i=p1;i>=1;i--) { L[len1++]=p[i]; if(i==p2) { flag=1; break; } }if(flag==0) for(int i=n;i>=p2;i--) L[len1++]=p[i];f=-INF; for(int i=1;i<=n;i++) if(p[i].y==ymin&&p[i].x>f) f=p[i].x,p2=i;f=-INF; for(int i=1;i<=n;i++) if(p[i].y==ymax&&p[i].x>f) f=p[i].x,p1=i;flag=0; for(int i=p1;i>=1;i--) { R[len2++]=p[i]; if(i==p2) { flag=1; break; } }if(flag==0) for(int i=n;i>=p2;i--) R[len2++]=p[i];for(int i=0;i<len2/2;i++) swap(R[i],R[len2-i-1]);bool fail=0; for(int i=0;i<len1;i++) if((LL)L[i].y*(LL)v>(LL)L[i].x*(LL)u) { fail=1; break; }int xmax=-INF; for(int i=1;i<=n;i++) xmax=max(xmax,p[i].x);if(xmax<=0) fail=0;if(fail==0) printf("%.6lf\n",1.0*w/u);else{double ans=0; int pre=0;for(int i=0;i<len2;i++){ans=ans+1.0*(R[i].y-pre)/u; pre=R[i].y;ans=max(ans,1.0*R[i].x/v);}ans=ans+1.0*(w-pre)/u;printf("%.6lf\n",ans);}return 0; }?
轉載于:https://www.cnblogs.com/zufezzt/p/5808421.html
總結
以上是生活随笔為你收集整理的CodeForces 703C Chris and Road的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django 模型
- 下一篇: Vijos1451圆环取数[环形DP|区