ZONeエナジー プログラミングコンテスト A - UFO襲来 / B - 友好の印【Python解答例】
ZONeエナジー プログラミングコンテストのA とB問題についてPythonの解答例を記事にしていきます。
atcoder.jp
ZONeエナジー プログラミングコンテスト A - UFO襲来
問題文
長さ 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 - 友好の印
問題文
あなたは今、高さ 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でした。