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

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