A問題 Horizon
方針
問題文に計算式が記載されているので、この通りに計算を行います。
平方根の計算をするとき、Pythonではmathモジュールを用います。
“import math”でモジュールをインポートし、
“math.sqrt(x)”でxの平方根の計算を行います。
解答
1 2 3 4 5 |
import math h = int(input()) ans = math.sqrt(h*(12800000+h)) # math.sqrt()で平方根の計算ができる print(ans) |
B問題 Integer Division
方針
入力値xを10で割った数以下の整数の内、一番大きい整数を表示する問題です。
入力値xが割り切れるかどうか、正負のどちらかの2回に分けてifで条件を分けています。
解答
1 2 3 4 5 6 7 8 9 |
x = int(input()) if x%10 ==0: #xが10で割り切れるとき print(x//10) #10÷xが最大値なのでそのままprint else: #xが10で割り切れないとき if x > 0: #xが正の数のとき print(x//10) #[1]x//10をprint elif x < 0: #xが負の数のとき print((x//10)) #[2]x//10をprint |
[1]
“x//10″は少数部分を切り捨てています。
22.4 , 5.5 , 1.7 , 9.1など、xが正の数の時は、10で割った時はその整数部分がそのまま答えになります。
[2]
xが10で割り切ることができず、さらに負の数の時は、xを10で割った数の整数部分をそのまま使うことはできません。
“x//10″とすることで、小数部分は切り下げされ、整数部分が-1されます。
例: “-22.4/10″→-2.2399・・・
“-22.4//10″→-3
C問題
方針
点(x1,y1)、点(x2,y2)のどちらからもユークリッド距離が√5となる点(a,b)が存在するかを調べる問題です。
問題文の2点間の距離の求め方から、以下の2つの式を同時に満たせばYesと出力すれば良いと思います。
※左右の辺をそれぞれ2乗しています。
①(x1-a)**2 + (y1-b)**2 = 5
②(x2-a)**2 + (y2-b)**2 = 5
この2つを満たすときに点(a,b)は、点(x1,y1)と点(x2,y2)のどちらからも√5の距離に位置しています。
ユークリッド距離が√5になるためには、点(a,b)と点(x,y)はそれぞれのx座標とy座標が±2までの変動幅に収まる必要があります。
そのため、-2~2までをfor文で繰り返し、最初の①、②の式を満たすかを確認します。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
x1,y1,x2,y2 = map(int, input().split()) list = [-2,-1,1,2,2] #x座標、y座標の変動幅 #x1-a)**2 + (y1-b)**2 == 5 and (x2-c)**2 + (y2-d)**2 == 5 #条件式 for i in list: #x座標を-2~2まで変動させる for j in list: #y座標を-2~2まで変動させる a = x1+i #点(a,b)のaを変動させた後のx座標として設定 b = y1+j #点(a,b)のbを変動させた後のy座標として設定 if (x1-a)**2 + (y1-b)**2==5 and (x2-a)**2 + (y2-b)**2==5: #点(a,b)が点(x1,y1)と点(x2,y2)のどちらからも等しく√5の距離にあるか調べる print("Yes") exit() print("No") |
余談ですが、|x-a|=1、|y-b|=2、もしくは|x-a|=2、|y-b|=1のどちらかを必ず満たすように見えています。
|x-a|=0、|y-b|=5、もしくは|x-a|=5、|y-b|=0というパターン、つまりx座標かy座標のどちらか一方だけが動くパターンもあるかなと思ったのですが、listには0が含まれていなくとも正解になりました。
コメント