AtCorder Beginner Contest 174 に参加しました。
ABDの3問ACでした。
Python3を使用しています。
A問題
ifで条件分岐させます。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
s=int(input())
if s >= 30:
print("Yes")
else:
print("No")
if __name__ == "__main__":
main()
B問題
i番目の点と中心からの距離の2乗の値を、リストL[i]に入れます。
これがDの2乗より大きいかifで判定します。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
N, D = map(int,input().split())
X = [0] * N
Y = [0] * N
L = [0] * N
ans = 0
for i in range(N):
X[i], Y[i] = map(int, input().split())
L[i] = X[i] ** 2 + Y[i] ** 2
if L[i] <= D ** 2:
ans += 1
print(ans)
if __name__ == "__main__":
main()
C問題
$7、77、777、…$となる数列に$K$で割った余りが$0$となる数を求めます。
数列は$70、700、7000…$と増えるため、$K$と$10$が互いに素である場合のみしか成り立たない。
(この数列が$7$の倍数のため、$70$でなく$10$としている)
まずKが$2$の倍数または$5$の倍数のとき、数列にKの倍数は現れないので場合分けをします。
次に$7、77、777、…$となる数列を作り、それがKで割った余りが$0$となるまでwhile文で繰り返します。
$ x = (x * 10 + 7) % K $ではなく$ x = (x + 7 * 10 ** i) % K $
とすると$ 7 $ * $ 10 $ ** $ i $を計算するのに時間がかかるため、TLEとなりました。(2020/08/04編集しました)
下記は時間が終わってからACになった回答です。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
K = int(input())
x = 0
i = 0
if K % 2 == 0 or K % 5 == 0:
print(-1)
exit()
while True:
x = (x * 10 + 7) % K
i += 1
if x == 0:
print(i)
break
if __name__ == "__main__":
main()
D問題
左から右に並べられたN個の石を、左側にR右側にWとなるように並べます。
問題文を読むと、2つの石を入れ替える操作と1つの石の色を変える操作があります。
しかし、最小回数の操作で並べることを考えると、2つの石を入れ替える操作のみ行えば良いことが分かります。
まず石の並び順を文字列として読み込み、白い石の数wを求めます。
左から0~w番目は白い石であるべきなので、この範囲にある赤い石の数を求めます。
これが操作を行うべき数となり、答えです。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
N = int(input())
c = list(input())
w = c.count("R")
hidari = c[:w]
ans = 0
for i in hidari:
if i == "W":
ans += 1
print(ans)
if __name__ == "__main__":
main()