两题都不难。

对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动。假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变化的时间点即可。其实很明显的二分。。

CF #327 DIV2  D、E_iosCF #327 DIV2  D、E_#include_02
 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 }
View Code

 

对于E题,我觉得我是傻B了。可以求出每个国家到其他国家的最近距离,当然了,此时使用BFS,求出每个点到从本国的边缘点出发的最近距离。

首先假设交接点在某个国家,这样求三次都取最近距离。

再假设交接点在空白的点上,取某点到三个国家最近的距离和。

CF #327 DIV2  D、E_iosCF #327 DIV2  D、E_#include_02
 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 }
View Code