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

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

ZONeエナジー プログラミングコンテスト A - UFO襲来 / B - 友好の印【Python解答例】

f:id:ebisuke33:20210501230534p:plain

ZONeエナジー プログラミングコンテストのA とB問題についてPythonの解答例を記事にしていきます。
atcoder.jp



ZONeエナジー プログラミングコンテスト A - UFO襲来

A - UFO Invasion

問題文

長さ 12 の文字列 S が与えられます。
S の中に ZONe という文字列は (連続する部分文字列として) いくつ含まれるでしょうか?

制約

・S は英字からなる長さ 12 の文字列

解答例

s = input()

ans = 0

for i in range(len(s)-3):
    if s[i:i+4] == "ZONe":
        ans += 1

print(ans)

解説

与えられる文字列Sの中にZONeが何個あるか答える問題です。

文字列の切り取る位置を変えてZONeになるか探索していきます。
ZONeと一致すればans変数を増加させて、最後にansを出力すればOKです。

解説をみるとcount関数を使えばめちゃくちゃ簡単だったことがわかりました (^_^;)
Pythonを使いこなせていないです…



ZONeエナジー プログラミングコンテスト B - 友好の印

B - Sign of Friendship

問題文

あなたは今、高さ 1000 の非常に高いタワーの下にいます。タワーから距離 D 離れた位置の上空 H の高さに UFO がおり(入出力例 1 の図を参照してください)、あなたは UFO に電波を届けたいです。
タワーと UFO の間には遮蔽物が N 個あります。
i 番目の遮蔽物はタワーから UFO の方向に向かって距離 di の場所に位置していて、高さは hi です。
あなたはタワーを上って、あなたと UFO の間の直線上に遮蔽物が 1 つも無い状態にしたいです。上る必要のある最低の高さを求めてください。
なお、地面は凹凸のない水平面であり、タワー及び遮蔽物は地面と垂直に建っているものとします。
また、あなたと UFO の間の直線上にちょうど遮蔽物の上端があるとき、その遮蔽物には遮蔽されていないものとします。

制約

・入力は全て整数
・1≤N≤100
・1≤di

解答例

n, d, h = map(int,input().split())

D = []
H = []
for i in range(n):
    dd, hh = map(int,input().split())
    D.append(dd)
    H.append(hh)

ans = 0
for i in range(n):
    if D[i] != d:
        tilt = (h - H[i]) / (d - D[i])
        tmp = h - tilt * d
        ans = max(ans,tmp)

print(ans)

解説

N個の障害物に邪魔されずにUFOに電波を届けるためにはタワーの何階まで登ればよいか答える問題です。

障害物の数は100個までなので全探索すればOKです。

まずUFOと遮蔽物の上端を結ぶ直線の傾きをtiltとして求めました。
この直線がタワーと交わる点tmpが登らなければならない高さです。

この計算をすべての障害物に対して行って、最も高く登らなければならない高さを求め、出力すればACでした。