ABC203の解説。
A - Chinchirorin
解説
3つのサイコロを振って、a,b,cで2つが同じ目ならもう一つの目を、同じものがないときは0を出力する問題。
これは単純に2つが同じ目が出るとき、a==b
、b==c
、c==a
の場合で、もう1つの目を出力、この条件に引っかからなければ、0
を出力すれば良い。
コード
a, b, c = map(int, input().split())
if a == b:
print(c)
elif b == c:
print(a)
elif c == a:
print(b)
else:
print(0)
B - AtCoder Condominium
解説
N階建て、K号室まで持つマンションの総部屋番号の合計を出すもの。
i階のj号室の部屋番号はi0j
、つまり、i * 100 + j
と表せる。これらをループで表現し、total
に加えていくだけ。
コード
N, K = map(int, input().split())
total = 0
for i in range(1, N+1):
for j in range(1, K+1):
total += i * 100 + j
print(total)
C - Friends and Travel costs
解説
この問題を要約すると、最終的な所持金により太郎君がたどりつける村が決まるということ。
わかりにくい方は、日本全国を車で移動しているということを考えてほしい。
このとき村→距離、所持金→ガソリン、友達→ガソリンスタンドと考えてほしい。
最初、車にはK
Lのガソリンが入っている。車を走らせ、A
だけ進んだところにガソリンスタンドがあれば、B
L補充する。そしてガソリンが切れるまで走り続けると、イメージしてもらえばわかりやすいかと思う。
解き方だが、制約を見てもらうと分かる通り、単純にforループを回しただけでは、TLEしてしまう。
そこで所持金と村番号だけに注目する。
コードに沿って説明していく。
まず、l
にA
とB
の入力値をいれる。そして、これら入力値を昇順にソートする。これで村番号が早い順に並び替えることができる。
元々の所持金mny
を、現在の所持金now_mny
に代入する。
これを友達frd
の数だけループを回していく。
回していく段階で、村$A_i$が所持金よりも大きい場合は、到達できないので、その段階でbreak
する。対して、村$A_i$が所持金よりも小さい場合は、友達からお金$B_i$もらえるので、これを所持金now_mny
に足す。
結果、最終的な所持金now_mny
が進んだ村番号と対応しているので、これを出力すればよい。
コード
frd, mny = map(int, input().split())
l = []
for _ in range(frd):
A, B = map(int, input().split())
l.append((A, B))
l.sort()
now_mny = mny
for i in range(frd):
A, B = l[i]
if now_mny >= A:
now_mny += B
else:
break
print(now_mny)