問題
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;
}
};
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;
}
};