SRM467 Div1 250 LateProfessor

作業してたらいつの間にかSRMの時間を過ぎてたので,あとから解いてみる.

問題

  • 時間0に来たJohnがwaitTimeだけ教室で待ちwalkTime散歩するループを繰り返す
  • 教授が時間bestTimeからworstTimeの間に来て,教授の到着からlateTime以上遅れると遅刻
  • Johnが遅刻扱いされる確率は?


解いてみた

  • 境界条件で何故か混乱して無駄に時間がかかってしまった.
  • bestTime = worstTimeのときだけマジメに考える
  • それ以外なら単位時間内で支配的な方にカウントする
  • 絶対にもっと綺麗な解き方ありそう….
#include <iostream>

using namespace std;

class LateProfessor{
public:
    double getProbability(int wait, int walk, int late, int best, int worst){
        if(best == worst){
            int time = 0;
            while(true){
                time += wait;
                if(best <= time) return 0.0;
                time += walk;
                if(best + late <= time) return 1.0;
            }
        }
        static bool ok[10000001];
        memset(ok, false, sizeof(ok));
        int t = 0;
        while(t<=worst){
            for(int i=0;i<wait&&t<=worst;i++) ok[t++] = true;
            for(int i=0;i<walk&&t<=worst;i++){
                if(i+late>=walk) ok[t] = true;
                t++;
            }
        }
        double res = 0.0;
        for(int i=best;i<worst;i++) res += (1.0-ok[i])/(worst-best);
        return res;
    }
};