0
1

More than 3 years have passed since last update.

【AtCoder】ABC203をPython3で解説

Last updated at Posted at 2021-05-31

ABC203の解説。

A - Chinchirorin

解説

3つのサイコロを振って、a,b,cで2つが同じ目ならもう一つの目を、同じものがないときは0を出力する問題。

これは単純に2つが同じ目が出るとき、a==bb==cc==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

解説

この問題を要約すると、最終的な所持金により太郎君がたどりつける村が決まるということ。

わかりにくい方は、日本全国を車で移動しているということを考えてほしい。
このとき村→距離、所持金→ガソリン、友達→ガソリンスタンドと考えてほしい。
最初、車にはKLのガソリンが入っている。車を走らせ、Aだけ進んだところにガソリンスタンドがあれば、BL補充する。そしてガソリンが切れるまで走り続けると、イメージしてもらえばわかりやすいかと思う。

解き方だが、制約を見てもらうと分かる通り、単純にforループを回しただけでは、TLEしてしまう。

そこで所持金と村番号だけに注目する。
コードに沿って説明していく。

まず、lABの入力値をいれる。そして、これら入力値を昇順にソートする。これで村番号が早い順に並び替えることができる。

元々の所持金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)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1