SRM467 Div1 Easy(250), Div2 Medium(500) LateProfessor
教授がlateTime未満の遅れなら許容するというのは、教授が遅れを全く認めなくてJohnがlateTime早く返ってくるということと同じ。教授が来る可能性がある時間帯のうちJohnが居ない時間を求める。Johnは同じ行動を繰り返すので、waitTime+walkTimeで割った余りを考える。
#include <algorithm> using namespace std; class LateProfessor { public: double getProbability( int waitTime, int walkTime, int lateTime, int bestArrival, int worstArrival ); }; double LateProfessor::getProbability( int waitTime, int walkTime, int lateTime, int bestArrival, int worstArrival ) { if ( walkTime < lateTime ) return 0; int T = waitTime + walkTime; int best = bestArrival % T; int worst = worstArrival % T; if ( best > worst ) worst += T; if ( bestArrival == worstArrival ) return waitTime<best && best<=T-lateTime ? 1 : 0; double t = 0; // bestArrival-worstArrivalのうちJohnが居ない時間 if ( best < T-lateTime && waitTime < worst ) t += min(T-lateTime,worst) - max(waitTime,best); if ( T+waitTime < worst ) t += min(2*T-lateTime,worst) - (T+waitTime); t += (double)((worstArrival-bestArrival)/T*T) * (T-waitTime-lateTime)/T; return (double)t / ( worstArrival - bestArrival ); }