過去問精選 10 問やってみる 4

前回の続きから
例題を解きまくります。

****************************************************

ABC 068 B - Break Number (例題によく似た問題です)
https://atcoder.jp/contests/abc068/tasks/abc068_b
すべての値に対してループで割って割れる数を確認し、カウントしておく

N = int(input())
max = 0
ans = 1

for i in range(1, N+1):
  count = 0
  k = i
  while (k % 2 == 0):
    count += 1
    k /= 2

  if count > max:
    max = count
    ans = i
    
print(ans)


ABC 102 B - Maximum Difference (できれば for 文を 1 回だけ使って解いてみましょう)
https://atcoder.jp/contests/abc102/tasks/abc102_b
for文二つ使っちゃいました・・・

N = int(input())
a = list(map(int, input().split()))
max = 0
for i in range(len(a)+1):
  for j in range(i+1, len(a)):
    print(i, j)
    if max < abs(a[i] - a[j]):
      max = abs(a[i] - a[j])
print(max)

ABC 113 B - Palace (最小値を求めるだけでなく、最小になる index を求める書き方も確認しましょう)
https://atcoder.jp/contests/abc113/tasks/abc113_b
for文で回して最小値とその場所を保持しておく

N = int(input())
T, A = map(int, input().split())
H = list(map(int, input().split()))
min = 10000000
j = 0
pos = 0

for i in H:
  j += 1
  if abs(A - (T - 0.006 * i)) < min:
    min = abs(A - (T - 0.006 * i))
    pos = j
print(pos)

ABC 072 B - OddString (文字列に対する for 文も、数列に対する for 文と同様です)
https://atcoder.jp/contests/abc072/tasks/abc072_b
文字列を配列として読んで、偶数の場合のみ値をピックアップして表示

S = input()
k = ""
for i in range(len(S)):
  if i % 2 == 0:
    k += S[i]
print(k)


ABC 053 B - A to Z String (同じく文字列に対する for 文です)
https://atcoder.jp/contests/abc053/tasks/abc053_b
for文をまわして、スタートとゴールの値を保持する
スタートは一番最初を、ゴールは一番最後を採用する

S = input()
k = 0
st = 2000000
gl = 0
for i in range(len(S)):
  if S[i] == "A":
    if st > k:
      st = k
  k += 1
  if S[i] == "Z":
    if gl < k:
      gl = k
print(gl - st)


ABC 095 B - Bitter Alchemy (max や sum といった、for 文テクニックの総動員です)
https://atcoder.jp/contests/abc095/tasks/abc095_b
最小値を保持しつつ、全入力値分を合計から引いて行って最後に商を足す

N, M = map(int, input().split())
min = 1000000000
sum = 0
for i in range(N):
  j = int(input())
  if min > j:
    min = j
  M -= j
  sum += 1
print(sum + M // min)

****************************************************

ABC 105 B - Cakes and Donuts (Coins にとてもよく似た問題です)
https://atcoder.jp/contests/abc105/tasks/abc105_b
まず、どちらかが0だった場合は、もう片方で割り切れたらmodが0となるはず
さらに、0にならなければそれぞれ1個以上あると仮定して合計数から引き算する
合計数がマイナスになったら組み合わせとして存在しないからNoを返す

N = int(input())
ans = "No"
while (N >= 0):
  if N % 4 == 0 or N % 7 == 0:
    ans = "Yes"
  N -= 11
print(ans)


ARC 004 A - 2点間距離の最大値 (大昔の ARC の問題ですが現在なら 200 点相当の問題です、小数点出力方法も確認しましょう)
https://atcoder.jp/contests/arc004/tasks/arc004_1
2重ループを作り、すべての組を試し最大値を保持する

N = int(input())
a = [list(map(int, input().split())) for _ in range(N)]
max = 0
for i in range(len(a)):
  for j in range(i+1, len(a)):
    #print(i, j)
    #print(a[i], a[j])
    p = a[i][0]
    q = a[i][1]
    r = a[j][0]
    s = a[j][1]
    leng = ((p-r)**2 + (q-s)**2)**0.5
    if leng > max:
      max = leng
print(max)

ABC 051 B - Sum of Three Integers (X と Y を全探索します)
https://atcoder.jp/contests/abc051/tasks/abc051_b
for文は2つまでにしましょうね、組み合わせに負の数入ってきてしまったので条件修正

K, S = map(int, input().split())
count = 0
for i in range(K+1):
  for j in range(K+1):
    if S - (i + j) <= K and S - (i + j) >= 0:
      #print(i, j, (S - (i + j)))
      count += 1
print(count)


以上