CF #327 DIV2 D、E
两题都不难。
对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动。假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变化的时间点即可。其实很明显的二分。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 int x1,y1,x2,y2; 8 double v,t; 9 int fx,fy,sx,sy; 10 11 double dis(double x,double y){ 12 return x*x+y*y; 13 } 14 15 bool ok(double st){ 16 if(st<=t){ 17 if(dis(x2-fx*st-x1,y2-fy*st-y1)-v*st*v*st>1e-8) return false; 18 else return true; 19 } 20 else{ 21 st-=t; 22 if(dis(x2-fx*t-sx*st-x1,y2-fy*t-sy*st-y1)-v*v*(st+t)*(st+t)>1e-8) return false; 23 return true; 24 } 25 } 26 27 int main(){ 28 while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF){ 29 scanf("%lf%lf",&v,&t); 30 scanf("%d%d%d%d",&fx,&fy,&sx,&sy); 31 double l=0,r=1e9; 32 double ans=0; 33 while(r-l>1e-8){ 34 double m=(r+l)/2; 35 if(ok(m)){ 36 ans=m; 37 r=m; 38 } 39 else{ 40 l=m; 41 } 42 } 43 printf("%.8lf\n",ans); 44 } 45 return 0; 46 }
对于E题,我觉得我是傻B了。可以求出每个国家到其他国家的最近距离,当然了,此时使用BFS,求出每个点到从本国的边缘点出发的最近距离。
首先假设交接点在某个国家,这样求三次都取最近距离。
再假设交接点在空白的点上,取某点到三个国家最近的距离和。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 9 char str[1005][1005]; 10 int n,m; 11 int dis[4][1005][1005]; 12 13 struct Node{ 14 int x,y; 15 Node(){} 16 Node(int xx,int yy){ 17 x=xx,y=yy; 18 } 19 }; 20 21 int dir[4][2]={ 22 {0,1}, 23 {1,0}, 24 {-1,0}, 25 {0,-1} 26 }; 27 28 int p[4]; 29 30 bool ok(int x,int y){ 31 if(x<1||x>n||y<1||y>m) return false; 32 return true; 33 } 34 35 void slove(int ind){ 36 queue<Node>que; 37 for(int i=1;i<=n;i++){ 38 for(int j=1;j<=m;j++){ 39 if(str[i][j]=='0'+ind) 40 que.push(Node(i,j)),dis[ind][i][j]=0,p[ind]=0; 41 } 42 } 43 Node tmp,nxt; 44 while(!que.empty()){ 45 tmp=que.front(); 46 que.pop(); 47 for(int k=0;k<4;k++){ 48 nxt.x=tmp.x+dir[k][0]; 49 nxt.y=tmp.y+dir[k][1]; 50 if(!ok(nxt.x,nxt.y)) continue; 51 if(dis[ind][nxt.x][nxt.y]!=-1) continue; 52 if(str[nxt.x][nxt.y]=='#') continue; 53 dis[ind][nxt.x][nxt.y]=dis[ind][tmp.x][tmp.y]+1; 54 if(str[nxt.x][nxt.y]>='1'&&str[nxt.x][nxt.y]<='3'){ 55 if(str[nxt.x][nxt.y]=='1'&&p[1]==-1) p[1]=dis[ind][nxt.x][nxt.y]; 56 if(str[nxt.x][nxt.y]=='2'&&p[2]==-1) p[2]=dis[ind][nxt.x][nxt.y]; 57 if(str[nxt.x][nxt.y]=='3'&&p[3]==-1) p[3]=dis[ind][nxt.x][nxt.y]; 58 } 59 que.push(Node(nxt.x,nxt.y)); 60 } 61 } 62 } 63 64 int main(){ 65 while(scanf("%d%d",&n,&m)!=EOF){ 66 for(int i=1;i<=n;i++){ 67 scanf("%s",str[i]+1); 68 } 69 int ans=-1; 70 memset(dis[1],-1,sizeof(dis[1])); 71 memset(p,-1,sizeof(p)); 72 slove(1); 73 if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); 74 memset(dis[2],-1,sizeof(dis[2])); 75 memset(p,-1,sizeof(p)); 76 slove(2); 77 if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); 78 memset(dis[3],-1,sizeof(dis[3])); 79 memset(p,-1,sizeof(p)); 80 slove(3); 81 if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2); 82 for(int i=1;i<=n;i++){ 83 for(int j=1;j<=m;j++){ 84 if(dis[1][i][j]==-1) continue; 85 if(dis[2][i][j]==-1) continue; 86 if(dis[3][i][j]==-1) continue; 87 ans=ans==-1?dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2:min(ans,dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2); 88 } 89 } 90 printf("%d\n",ans); 91 92 } 93 return 0; 94 }