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

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

キャディプログラミングコンテスト2021(ABC193) A - Discount / B - Play Snuke【Python解答例】

f:id:ebisuke33:20210319150606p:plain
AtCoder Beginner Contest193のA - DiscountとB - Play SnukeについてPythonの解答例を記事にしていきます。
atcoder.jp


AtCoder Beginner Contest193 A - Discount

A - Discount

問題文

定価 A 円の商品が B 円で売られているとき、この商品の売値は定価の何パーセント引きですか?

制約

・A,B は整数
・1≤B

解答例

a, b = map(int,input().split())

print((a - b)* 100/a)

解説

問題文のように売値の割引率を答える問題です。

パーセント表示にするため定価AからBを引いた値に100をかけて、定価のAで割った値が解答になります。

AtCoder Beginner Contest193 B - Play Snuke

B - Play Snuke

問題文

高橋くんは人気ゲーム機「スヌケマシン」を買おうとしています。
スヌケマシンを販売している店は店 1,2,…,N の N 軒あり、店 i は高橋くんの現在地から徒歩 Ai 分、スヌケマシンの販売価格は Pi 円、現在のスヌケマシンの在庫は Xi 台です。
高橋くんは今から徒歩でスヌケマシンを販売している店に向かい、店に着いたときにスヌケマシンの在庫があればスヌケマシンを買います。
しかし、スヌケマシンは人気商品なので、今から 0.5,1.5,2.5,… 分後に全ての店でスヌケマシンの在庫が (存在するなら) 1 台減ります。
高橋くんがスヌケマシンを買うことができるか判定し、できる場合は買うのに必要な最小の金額を求めてください。

制約

・入力は全て整数
・1≤N≤10^5
・1≤Ai,Pi,Xi≤10^9

解答例

n = int(input())

A = [] # 移動時間のリスト
P = [] # 販売価格のリスト
X = [] # 在庫のリスト
for i in range(n):
    a, p, x = map(int,input().split())
    A.append(a)
    P.append(p)
    X.append(x)

ans = int(1e10) # 解答する値段を最大の販売価格より大きい値で初期化

for i in range(n):
    if X[i] - A[i] - 1 >= 0: # i 番目のお店に着いたときに在庫があるか判定
        ans = min(ans,P[i]) # 在庫があれば販売価格とansの小さいほうを代入する

if ans == int(1e10):
    print(-1)
else:
    print(ans)

解説

N個の店があり、各店に行くまでの移動時間と販売価格、在庫数が与えられます。
0.5,1.5,2.5,… 分後にすべてのお店から在庫が1台ずつ減っていきます。
在庫があるうちにお店につけたら販売価格で買うことができる、という条件のなかで最も安く買える値段を解答する問題です。

N個のお店について全探索しました。
解答する値であるansは販売価格より大きい10^10を初期値としました。

ループでi 番目のお店に着いたときに在庫があるか判定します。
在庫は1分後には1台減っていますので、在庫数Xi - 1から移動時間Aiを引いた値が0以上なら商品を買うことができます。
i 番目のお店の販売価格がansより小さければ、その販売価格に更新します。

ループを抜ければ最も安く買える価格がわかりますので、それを解答します。
もし初期値のままなら、どのお店にいっても購入できないことになりますので-1を出力すればOKでした。




今回のコンテストでもC,D問題が解くことができなかったですが、頑張って復習していきます。
内容を理解できましたら記事にしていきたいと思います。


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