SRM 431 DIV1 Easy - LaserShooting (復習××)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=10258&rd=13522

(0,0)の位置からレーザーが発射される。
レーザーは(x、y1)(x、y2)の二つの値が与えられ、その間を通るように発射される。y1、y2の範囲は[-2/PI,2/PI]。
このような(x、y1)(x、y2)が複数与えられるとき、ある点がレーザーに当たる確率を求める。

解き方


全ての点について確率を求めていては間に合わない。
そのため、各(x,y1)(x,y2)に対しレーザーの当たる範囲の確率を足していけばよい。

arctanの使い方を忘れていたので、こちらのサイトを拝見させていただきました。
http://78578203.at.webry.info/201101/article_2.html

コード


class LaserShooting {

public: double numberOfHits(vector<int> x, vector<int> y1, vector<int> y2) {
double ret=0.0;
int n=y1.size();

FORE(i,0,n){
double tmp1=atan((double)y1[i]/(double)x[i]);
double tmp2=atan((double)y2[i]/(double)x[i]);
ret+=fabs(tmp1-tmp2)/M_PI;
}

return ret;
}

};
このエントリーをはてなブックマークに追加