SRM467 Div1 Easy(250), Div2 Medium(500) LateProfessor

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 );
}