AtCoder Beginner Contest 197(Sponsored by Panasonic)「D - Opposite」纏め

第4問も考え方が特殊だったので、一応メモを残して置きますφ(..)

 

この問題のポイント

・正N角形

・Nは偶数

・与えられるのはx0,y0,xN2,yN2 

この3つがこの問題のミソです。

 

何がミソかと言うと、p0とp(n/2)は対角線の位置になるということ。

もう一つのポイントは正N角形。正N角形は全ての角が1つの円の円周上にあるということ。

この2つを考慮すると、p0とp(n/2)の中点が正N角形に外接する円の中心と一致する

ということで、中心は

X座標:(x0+x(n/2))/2
Y座標:(y0+y(n/2))/2

となります。

 

地味な落とし穴:型には気を付けろ

今までint型ばっかり使っていたのですが、今回地味な落とし穴がありました。

それは小数点表示ができない…

3 / 2 = 1.5 にならず

3 / 2= 1となってしまいました。

 

これは小学生的に考えると分かりやすくて

3 / 2=1 余り 1なので、商は1と言うことですね

 

これを小数点表示にするにはdouble型にキャストしてあげる必要があります。

 

ちなみに面倒なら最初からdouble型にしてしまうのも手です。ちなみに私はそうした

そうすると、キャスト不要になるので、コードを短くできます♪

 

外接円の中心から答えを求める

では、目的のp1を求める方法を考えていきましょう。

自分がパッと思いついたのはp0からx軸方向ずらしてあげる。

この時ずらすのは、三角関数で求められそう、そんな構想で考えるが、2個目の解けない…

ここで気づいたのはp0とp1の直線はx軸に平行じゃない

そう、斜めも存在するのだ…

ということはy軸方向にもずらさないと行けないけど、そうなってくると、中心角から三角関数で求めてあげましょう

つまり、中心から角度を出して、360°/N反時計回りにずらしてあげる、というのが正しいっぽいです。

なお、中心角とp0、x軸の角度は、atan2(x1, y1, x2, y2)で求められるみたいです。

 

中心から(x0,y0)の角度θ+360°/n反時計回りにずれた位置が回答になります。

x1=xc - cos(θ+360°/n) * r
y1=yc - sin(θ+360°/n) * r(rは半径)

 

今回は一発合格できました。

めでたしめでたし。

Submission #21523661 - AtCoder Beginner Contest 197(Sponsored by Panasonic)