はじめに
こんにちは!Qiita初投稿です
この記事では,paizaの新作ゲーム 電脳少女プログラミング2088 ─壊レタ君を再構築─ にて出題されている問題のうち,C・Dランク相当の問題を4問解説します.
以下が今回解説する問題です.
- Dランク:カジノ,郊外のスラム街,ネオン街の裏路地
- Cランク:自然の残る公園
より簡単なDランク問題から,早速解説していきます
Dランク問題:カジノ
問題文
あなたはカジノにやってきました。
カジノで使われるチップは 1ドルのもの, 5ドルのもの, 10ドルのものがあるようです。
各チップの枚数が 1ドル, 5ドル, 10ドルの順で改行区切りで与えられるので合計で何ドルかを出力してください。
a #1ドルの枚数
b #5ドルの枚数
c #10ドルの枚数
金額ごとの枚数を受け取り,合計金額を計算すればよいです
a=int(input())
b=int(input())
c=int(input())
print(a+5*b+10*c)
Dランク問題:郊外のスラム街
問題文
郊外のスラム街にジャンク品を扱うお店があります。
あなたはある商品を買おうとしましたがジャンク品なので値切ろうとしています。
値切りの戦略はまず半額を希望しそれが駄目な場合に半額から 100 増やした値段を伝えることにしました。
ある商品の値段 n が与えられるので上記の戦略で半額の希望が駄目だった場合の額を出力してください。
条件
nは10の倍数
n #値段
nを2で割った値に100を足して出力しろ という問題です.
条件によるとnは10の倍数なので,2で割り切れます.
/ ではなく // を使うことで,小数点以下の .0 の登場が回避でき,少し楽ができます.
n=int(input())
print(100+(n//2))
Dランク問題:ネオン街の裏路地
問題文
あなたは裏路地にある扉を開けようとしています。
扉は n 個あり各扉は順不同に数字が書かれています。
最も大きな扉の数字を出力してください。
n
m_1
m_2
.
.
.
m_n
縦n行にわたる入力の受け取りと,配列内の最大値の求め方が重要です.
配列内の最大値は max() 関数で取得できます.
ついでに,縦または横に多くのデータが入力されるときの受け取り方法をまとめておきます
n=int(input())
a=[int(input()) for i in range(n)] #整数ではなく文字列の場合はintをstrに変える
a=[int(i) for i in input().split()] #整数ではなく文字列の場合はintをstrに変える
以下がこの問題の回答例です
n=int(input())
m=[int(input()) for i in range(n)]
print(max(m))
Cランク問題:自然の残る公園
問題文
自然の残る公園にいくつかのビーコン反応があります。
現在地の座標 (y, x) から最も近いビーコンの反応の地点を目指すことにしました。
N 個のビーコンが発信されている座標と現在の座標が与えられるので最も近いビーコンの番号を出力してください。
条件
5 ≦ N ≦ 100
-1000 ≦ y_i, x_i, a, b ≦ 1000 (1 ≦ i ≦ N)
最も近いビーコンはただひとつ存在する
N a b
y_1 x_1
y_2 x_2
.
.
.
y_N x_N
初期値 t をある程度大きい値で設定して,N個の点それぞれとの距離を比較し,小さければ t を更新するという方法を取ることにします.
出力するのは最も近い点の番号なので,現在最も近い点の番号を k として保存します.
t が更新されるたびに,k の値も更新します.
距離の比較は三平方の定理を用いることで簡単にできますね.
ルートをしてもしなくても距離の大小関係は変わらないので,ルートはせずに比較します.
条件から,点同士の距離の2乗は最大でも$2000^2+2000^2=8000000$なので,
t = 8000001としておきます.
n,a,b=map(int,input().split())
c=[list(map(int,input().split())) for _ in range(n)]
t=8000001
k=0
for i in range(n):
if t> (c[i][0]-a)**2+(c[i][1]-b)**2:
t= (c[i][0]-a)**2+(c[i][1]-b)**2
k=i+1
print(k)
最後に
記事は以上です!
ありがとうございました