1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include <iomanip>

int v[3],n,vmax;
long double t[3]={1e9,1e9,0};
long double new_time[3];
int a[3]={-1,-1,0};
int b[3]={0,0,1};
char x;
std::string road[3];
int main(){
    std::ios_base::sync_with_stdio(0);
    std::cin>>n>>vmax>>v[0]>>v[1]>>v[2];
    std::cin>>road[0]>>road[1]>>road[2];
    for(int i=0;i<3;i++){
        while(b[i]<road[i].size()&&road[i][b[i]]=='#')
            b[i]++;
    }
    long double result=0;
    while(true){
        //std::cout<<"a: "<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<std::endl;
        new_time[0]=1e9;
        new_time[1]=1e9;
        new_time[2]=1e9;
        long double a1b0=(a[1]-b[0])/(long double)(v[0]-v[1]);
        long double a2b1=(a[2]-b[1])/(long double)(v[1]-v[2]);
        long double d0=((a[1]+v[1]*t[1])-(b[0]+v[0]*t[1]))/(long double)(vmax-v[0]);
        if(t[1]<=a1b0)
            new_time[0]=t[1]-d0;
        long double d1=((a[2]+v[2]*t[2])-(b[1]+v[1]*t[2]))/(long double)(vmax-v[1]);
        if(t[2]<=a2b1)
            new_time[1]=t[2]-d1;
        //std::cout<<"t: "<<new_time[0]<<" "<<new_time[1]<<" "<<new_time[2]<<" "<<std::endl;
        
        long double d=((a[0]+v[0]*t[0])-(b[1]+v[1]*t[0]))/(long double)(vmax-v[1]);
        
        //std::cout<<t[1]<<" "<<d2<<" "<<b2a1<<std::endl;
        int mod=(a[0]+1>=road[0].size()||road[0][a[0]+1]=='.'?1:0);
            
        long double b1a0=(b[1]-a[0]-mod)/(long double)(v[0]-v[1]);
            new_time[1]=std::min(new_time[1],std::max(t[0]-d,b1a0));
        
        
        long double d2=((a[1]+v[1]*t[1])-(b[2]+v[2]*t[1]))/(long double)(vmax-v[2]);
        //std::cout<<"d2: "<<d2<<std::endl;
        
        mod=(a[1]+1>=road[1].size()||road[1][a[1]+1]=='.'?1:0);
        long double b2a1=(b[2]-a[1]-mod)/(long double)(v[1]-v[2]);
        
        //std::cout<<"                                   "<<t[1]<<" "<<d2<<" "<<b2a1<<std::endl;
        //if(d2>=0)
            new_time[2]=std::min(new_time[2],std::max(t[1]-d2,b2a1));
            
        //std::cout<<(b[2]-a[1])<<" "<<(long double)(v[1]-v[2])<<" t: "<<new_time[0]<<" "<<new_time[1]<<" "<<new_time[2]<<" "<<std::endl;
        
        for(int i=0;i<3;i++){
            if(b[i]-a[i]==1)
                new_time[i]=std::min(new_time[i],t[i]+1/(long double)(vmax-v[i]));
        }
        //std::cout<<"t: "<<new_time[0]<<" "<<new_time[1]<<" "<<new_time[2]<<" "<<std::endl;
        
        //std::cout<<"b: "<<b[0]<<" "<<b[1]<<" "<<b[2]<<" "<<std::endl;
        long double sma=std::min(new_time[0],std::min(new_time[1],new_time[2]));
        for(int i=0;i<3;i++)
            if(new_time[i]==sma){
                    //std::cout<<"track: "<<i<<" a: "<<b[i]<<" time: "<<new_time[i]<<std::endl;
                    if(b[i]<=road[i].size()&&b[i]>0&&road[i][b[i]-1]=='#')
                        result=std::max(result,new_time[i]);
                    t[i]=new_time[i];
                    a[i]=b[i];
                    b[i]++;
                    while(b[i]<road[i].size()&&road[i][b[i]]=='#')
                        b[i]++;
            }
    
        //std::cout<<"t: "<<new_time[0]<<" "<<new_time[1]<<" "<<new_time[2]<<" "<<std::endl;
        if(a[0]==n){
            std::cout<<std::fixed<<std::setprecision(20)<<result<<std::endl;
            return 0;
            }
            
        
    }
    
   
        
   
    
    
    return 0;
}