ABC206の解説。
A - Maxi-Buying
解説
N
の消費税込みの値段を、206円と比較してどうなるかという問題。
N
にそのまま1.08をかけると、0以下の数字が表示されてしまうため、p = N * 108 // 100
として、表示させないようにすれば良い。
あとはif
で場合分けをすると完成。
コード
N = int(input())
p = N * 108 // 100
if p < 206:
print('Yay!')
elif p == 206:
print('so-so')
else:
print(':(')
B - Savings
解説
i日目の朝にi円を入れるという問題。
while
を用いて、day
をtotal
に足していく。足していく中でtotal
がN
以上となれば、while
ループを抜け、day
を出力する。
また、while True:
として、break
を用いる方法もある。
コード1
# while 条件文:
N = int(input())
day = 0
total = 0
while total < N:
day += 1
total += day
print(day)
コード2
# while True:
N = int(input())
day = 0
total = 0
while True:
day += 1
total += day
if total >= N:
print(day)
break
C - Swappable
解説
N
個の数列からなる配列A
のうち、条件を満たす$(i, j)$の数を求めるという問題。
今回の条件では、「条件を満たすものを数える」よりも、「条件を満たさないものを数えて、全体から引く」という操作のほうが、計算量を少なく計算できる。
また、重複した値を数えなければならないので、dict()
を使う。
今回、A = [1, 2, 1, 3, 2]
の場合を考える。
まず、for i in range(N):
でA
の要素数分、ループを回す。
if A[i] not in cnt.keys():
で、設定した辞書cnt = {}
の中に値がなければ、値を数えるために、0
を追加しておく必要がある。
そして、現時点のcnt
に含まれている数であるi
から、重複のある$i = j$の数を引いてあげることで、現時点での今回の条件を満たす数を求めることができる。
これをans
に加えることによって、最終的な条件を満たす整数組の数を求めることができる。
cnt[A[i]] += 1
は、同じ数が何個あるのか数える操作である。
コード
N = int(input())
A = list(map(int, input().split()))
cnt = {}
ans = 0
for i in range(N):
if A[i] not in cnt.keys():
cnt[A[i]] = 0
ans += i - cnt[A[i]]
cnt[A[i]] += 1
print(ans)
編集後記
もう少しC問題を頭良く解けたらなーと感じた今日このごろ。