Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

AtCoder Beginner Contest 168 解説(A~C)

2020/05/17 (日) 21:00-22:40に、AtCoder Beginner Contest 168 が開催されました!

皆さん、お疲れ様でしたー。

私は、ABCの3完で撤退でした。

C問題はゴリゴリの数学でしたね。茶Difficultyはありそう...

 

では問題について振り返っていきましょう。

 

A問題 A - ∴ (Therefore)

https://atcoder.jp/contests/abc168/tasks/abc168_a

問題概要:

以下のルールに従って、与えられたNに対して、N本 というときの「本」の読みを出力して下さい。

  • N1の位が2,4,5,7,9の時"hon"
  • N1の位が0,1,6,8の時"pon"
  • N1の位が3の時"bon"

 解説:

Nを整数ではなく文字列と考えます。参照する文字列をSとします。

  • Nが3桁の時、3桁目をSとします。
  • Nが2桁の時、2桁目をSとします。
  • Nが1桁の時、そのままそれをSとします。

後は、Sを問題文のルールに従って場合分けし、出力をすればよいでしょう。

コード: https://atcoder.jp/contests/abc168/submissions/13292375

 

B問題 B - ... (Triple Dots)

https://atcoder.jp/contests/abc168/tasks/abc168_b

問題概要:

文字列Sと整数Kが与えられます。

|S|を文字列の長さとしたとき

  • |S| ≦ KならばSを、
  • そうでないならSの先頭K文字と"..."を続けて出力しなさい。

 解説:

Pythonでは、文字列の長さをlen(S)などで取得出来ます。

あとは、文字列の長さについて、条件分岐を行って処理をすれば良いです。

Sの先頭K文字は、Python3ではS[0:K]で取得出来ます。

コード: https://atcoder.jp/contests/abc168/submissions/13298567

C問題 C - : (Colon)

(解説を長くしています)

https://atcoder.jp/contests/abc168/tasks/abc168_b

問題概要:

時針の長さがAセンチメートル、分針の長さがBセンチメートルであるアナログ時計を考えます。

それぞれの針は一定の角速度で時計回りで回転します。時針は12時間、分針は1時間で1修します。

ちょうどHM分になったとき、2本の針の固定されていない位置の距離は何センチメートルでしょうか?

制約

  • 入力はすべて整数
  • 1A,B1000
  • 0H11

入力

入力は以下の形式で標準入力から与えられる。

A B H M

 

時計の針の位置について考えましょう。

時針の位置

HM分の時、時針が回る角度は真上を0度としてからH×30+M×0.5度です。

時針は12時間で1周するので、1分で0.5度回る事に注意して下さい。

なお、制約より、 この角度が360以上になることはありません。

この角度を、以降hとおきます。

分針の位置

M分の時、分針が回る角度は真上を0度としてM×6度です。

なお、制約より、この角度が360以上になることはありません。

 この角度を、以降mとおきます。

 

時針・分針の角度の求め方

時針が3時を指しているところを\theta =\begin{eqnarray}0^\circ\end{eqnarray} として、円を考えます。

f:id:Rute_programming:20200517222152p:plain

このような時計を考えます。

角度について以下のことを行います。

0≦h,m≦90の時、それぞれの針は0度より0時側に90-h度、あるいは90-m度進んでいることになります。

h,mが条件を満たしているとき、それぞれ90-h, 90-mと変換します。

 

90<h,m<360の時、それぞれの針は0時側に450-h度、あるいは450-m度動いていることになります。

h,mが条件を満たしているとき、それぞれ450-h,450-mと変換します。

(X度、0度から6時側に進んでいる というのは360-X度、0度から0時側に進んでいる と同じ意味になります。

今回は、90<h,mなので、90度を起点として このような処理を考えました)

 

少々説明がややこしくなってしまいましたが、このように、時針・分針の角度を考えれば、あとは入力の情報からそれぞれの時針・分針のx座標・y座標を考えれば良いです。

時針のx座標をx_1, y座標をy_1,

分針のx座標をx_2, y座標をy_2 とします。

この時、計算した角度を\thetaとおくと、

x_1 =  A×cos\theta

y_1 =  A×sin\theta

x_2 =  B×cos\theta

y_2 =  B×sin\theta

という座標になります。

後は、(x_1-x_2の絶対値の2乗)+(y_1-y_2の絶対値の2乗) つまりx座標とy座標の距離の差をそれぞれ求めて、それを平方根にしたものが求める距離となります。

 

Pythonのコードにすると以下のようになります。

f:id:Rute_programming:20200517223539j:plain

▲C問題のコードです(リンクからも確認できます)

コード: https://atcoder.jp/contests/abc168/submissions/13315659

 

以上、ABC 168のA問題~C問題の解説でした。

(C問題の解説が少々冗長かもしれません....)