ABC175 復習

1ヶ月ぶりくらいに挑戦しました。
結果はC問題までAC・・・。

A - Rainy Season

単純に文字数を数えるだけではWAになってしまうことに注意します。
連続してRが出る回数が答えとなるため、R以外が出現した場合はカウントを初期化するなどすればOKですね。
なお、公式解説によれば、ありうる解は23のパターンしかないので、全て試す方法もあるとのことでした。

s = input()

cnt = 0
ans = 0
for i in s:
  if i == 'R':
    cnt += 1
  else:
    cnt = 0
  ans = max(ans, cnt)

print(ans)

B - Making Triangle

少し考えましたが、Nが100までしかないので、N3でも十分に間に合います。
そこで、以下のように3重ループを回し、各辺の長さが異なるかつ、三角形として成り立つものの個数をカウントします。

N = int(input())
L = list(map(int, input().split()))

cnt = 0
for i in range(N):
  for j in range(i + 1, N):
    if L[i] == L[j]:
      continue
    for k in range(j + 1, N):
      if L[i] == L[k] or L[j] == L[k]:
        continue
      a = L[i]
      b = L[j]
      c = L[k]
      if a + b > c and b + c > a and c + a > b:
        cnt += 1


print(cnt)

C - Walking Takahashi

除算と剰余をうまく使用すれば解けます。 考え方としては、

  1. 近づけるところまで近づく
  2. 余った移動回数分については何度やっても結果は変わらない

といった風になるでしょうか。 例えば、 X=100、K=9999、D=17 である場合を考えてみると、
まず初めに可能な限り近くと、 100 - (17 * (100 / 17)) = 15となるため、現在位置は15となります。 これ以上近づくにはもう一度移動して、座標(−2)の位置に移動することとなります。 残った移動回数を試すにしても、−2の位置か、15の位置が最も近い座標の候補となります。
(−2 + 15と、15 - 17 を繰り返すことが最善になるため) つまり、残った移動回数が奇数か偶数かで、答えを判別できることとなります。

補足として、入力X(現在地)が負数の場合は正数に直してしまった方がやりやすいかなと思います。

X, K, D = map(int,input().split())

ans = 0
X = abs(X)
if X == K * D:
  ans = 0
elif X > K * D:
  ans = X - (K * D)
else:
  div = X // D
  temp = K - div
  if temp % 2 == 0:
    ans = X - (div * D)
  else:
    ans = abs(X - (div * D) - D)

print(ans)