ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC203 C - Friends and Travel costs【Python解答例】

f:id:ebisuke33:20210531211610p:plain

AtCoder Beginner Contest203のC問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 203(Sponsored by Panasonic) - AtCoder



AtCoder Beginner Contest203 C - Friends and Travel costs

C - Friends and Travel costs

問題文

10^100+1 個の村があり、それぞれ村 0, 村 1, …, 村 10^100 と番号がついています。0 以上 10^100−1 以下の全ての整数 i について、村 i で 1 円を払う事で村 (i+1) に移動することができます。 それ以外の移動方法はありません。

太郎君は初め K 円を持った状態で村 0 におり、その後、可能な限り大きな番号の村まで進もうとします。
太郎君には N 人の友達がいます。i 人目の友達は村 Ai にいて、太郎君が村 Ai に着いたときに Bi 円を太郎君に渡します。
太郎君が最終的にたどり着く村の番号を求めてください。

制約

・1≤N≤2×10^5
・1≤K≤10^9
・1≤Ai≤10^18
・1≤Bi≤10^9
・入力は全て整数である。

解答例

n, k = map(int,input().split())

AB = []
for i in range(n):
    a, b = map(int,input().split())
    AB.append([a,b])

AB.sort()

ans = k
for i in range(n):
    if ans < AB[i][0]:
        break
    else:
        ans += AB[i][1]

print(ans)

解説

1円払うことでi番目の村からi+1番目の村に移動することができます。
Ai番目の村にいる友人からBi円貰えるとき、どの村まで到達できるか答える問題です。

配列ABをソートすることで、お金を貰える地点をスタート地点から近い順番に並び替えました。

ソートを終えたあとでお金を貰える地点についてループさせて調べます。
ans変数は解答である到達できる村の番号で、最初k円持っているのでkを代入しました。

このansより次の友人がいる村が遠いとき、これ以上お金は増えないのでansまでしか到達できないことが確定します。
それ以外のとき友人がいる村に到達できますので、貰えるお金の分だけansを足していきました。

このループを抜けたあとは到達できる村の番号がansに代入されていますので、これを出力すればOKです!




ABC203の関連記事はこちら
ebisuke33.hatenablog.com