SRM 226 DIV1 Easy - ManhattanMovement (復習×○)
問題
http://community.topcoder.com/stat?c=problem_statement&pm=3498&rd=6515
・直線ax+by=1、スタート位置(x0,y0)が与えられる。
・スタート位置から直線上の点まで移動する。
・ただし、x軸に平行、もしくはy軸に平行のどちらか1回しか移動できない。
このとき、スタート位置から直線上の点まで移動するための最小の距離を求める。
解き方
問題文のx軸に平行もしくはy軸に平行の部分について、どちらも利用できると判断してしまった。
計算式を変換して、x軸に対する平行移動とy軸に対する平行移動のうちどちらか最小を返してあげればよい。
コード
class ManhattanMovement {
public: double getDistance(int a, int b, int x0, int y0) {
double ans=1e+18;
if(a!=0)ans=min(ans,fabs( (1.0-(double)b*(double)y0)/(double)a -(double)x0 ));
if(b!=0)ans=min(ans,fabs( (1.0-(double)a*(double)x0)/(double)b -(double)y0 ));
return ans;
}
};
public: double getDistance(int a, int b, int x0, int y0) {
double ans=1e+18;
if(a!=0)ans=min(ans,fabs( (1.0-(double)b*(double)y0)/(double)a -(double)x0 ));
if(b!=0)ans=min(ans,fabs( (1.0-(double)a*(double)x0)/(double)b -(double)y0 ));
return ans;
}
};