過去問精選 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)
以上