// horizon #include #include #include #include #include #include #include #include #include #include using namespace std; #define foreach(T, p, c) for(T p = (c).begin(); p != (c).end(); ++p) struct slope { int Eff; int Len; int From; slope(){} slope(int f, int e, int l){ Eff = e; Len = l; From = f; } slope(int f, int t, int s, int l){ if(s >= 60){ Eff = 10 * l; }else{ Eff = (70 - s) * l; } Len = l; From = f; } double AEff() const{ return ((double)Eff / (double)Len); } }; bool operator <(const slope &a, const slope &b){ double da = ((double)a.Eff / (double)a.Len); double db = ((double)b.Eff / (double)b.Len); return (da < db); } int N, R, S, D; vector Flat[120]; set Path[120]; void insert(int dest, slope p){ foreach(set::iterator, q, Path[dest]){ if((p.AEff() >= q->AEff()) && (p.Len <= q->Len)){ return; } } Path[dest].insert(p); } void solve(int dest){ if(dest == S){ return; } if(Path[dest].size() == 0){ foreach(vector::iterator, p, Flat[dest]){ int f = p->From; if(f == S){ Path[dest].insert(*p); }else{ solve(f); // set::iterator q = Path[f].begin(); foreach(set::iterator, q, Path[f]){ insert(dest, slope(q->From, p->Eff + q->Eff, p->Len + q->Len)); // Path[dest].insert(slope(q->From, p->Eff + q->Eff, p->Len + q->Len)); } } } } } int main() { ifstream cin("ski.txt"); int T; cin >> T; for(int iii=0; iii> N >> R >> S >> D; for(int i=0; i> f >> t >> s >> l; Flat[t].push_back(slope(f, t, s, l)); } solve(D); slope slp = *(Path[D].begin()); double deff = ((double)slp.Eff / (double)slp.Len); // cout << slp.Eff << " " << slp.Len << " " << deff << endl; printf("%.2f\n", deff); } }