AtCoder Beginner Contest 171に参加しました。
A~C問題まで解けました。そのときの思考を記します。
A - Rainy Season
長さ3の文字列からRの連続する個数を返す。ゴリ押しした。
S = input()
if 'RRR' in S:
print(3)
elif 'RR' in S:
print(2)
elif 'R' in S:
print(1)
else:
print(0)
B - Making Triangle
N本の棒の長さリストLが与えられる。このうち3つを選んで、条件をみたす組み合わせの個数を返す。
組み合わせを総当りで調べたが、そのためにitertools.combinationsを使用した。
使い方を競技中に調べるという……。
itertools.combinations(N,r)
リストNからr個選ぶ組み合わせのリストを返します。
例:combinations(range(5),3)→(0,1,2),(0,1,3),(0,1,4),(0,2,3),(0,2,4),(0,3,4),(1,2,3),(1,2,4),(1,3,4),(2,3,4)
import itertools
N = int(input())
L = list(map(int, input().split()))
count = 0
for i in itertools.combinations(range(N), 3):
Lx = sorted([L[i[0]], L[i[1]], L[i[2]]])
if not (Lx[0] == Lx[1] or Lx[1] == Lx[2] or Lx[2] == Lx[0]):
if Lx[0] + Lx[1] > Lx[2] :
count += 1
print(count)
C - Walking Takahashi
$X, K, D$ がそれぞれ、初期位置、移動回数、移動距離である。移動方向は正 or 負を選択でき、もっとも0に近づける。
$i$ を正に移動する回数とし、最終的な位置を $d$ とすると、
X + iD - \left((K-i)D\right) = d\\
X/D + (2i - K) = d/D\\
\frac{X/D - K}{2} + i = d/2D\\
$d$ の絶対値が $0$ に近い
⇒ $\frac{X/D - K}{2} + i ;(i=0,1,\ldots,K)$ がもっとも $0$ に近づく $i$ を求める。
⇒ $\frac{X/D - K}{2} = {\rm dist}$ と置き、
if dist > 0
⇒ i = 0
else if dist + K < 0
⇒ i = K
else
⇒ i = -round(dist)
を満たす $i$ のときの $|d|$ を求める。
X, K, D = list(map(int, input().split()))
dist= (X/D-K)/2
if -dist > K :
i = K
elif dist > 0 :
i = 0
else :
i = -round(dist)
print(abs(X + i*D - ((K-i)*D)))
#終わり
D問題以降はまだできていません、、、