AtCoder Beginner Contest 191をPythonで解く

投稿日:  更新日:2022/09/02

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回はAtCoder Beginner Contest 191を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - Vanishing Pitch

条件は, D<VTまたはVS<Dとなります.

# 入力
V, T, S, D = [int(x) for x in input().split()]
# 出力
if D < V * T or V * S < D:
print("Yes")
else:
print("No")

B - Remove It

配列Aを作成して, それを空白でつなげた文字列を用意し, 出力します.

# 入力
N, X = [int(i) for i in input().split()]
A = [int(i) for i in input().split()]
# 配列A'を用意
Aprime = []
for i in range(N):
if A[i] != X:
Aprime.append(A[i])
# 出力(A'が空白の場合を考慮)
if Aprime == []:
print()
else:
Aprimestr = ""
for i in range(len(Aprime)-1):
Aprimestr += str(Aprime[i]) + " "
Aprimestr += str(Aprime[-1])
print(Aprimestr)

あるいは, 文字列メソッドjoin()を使うと, 文字列のリストを一つの文字列に連結することができます. 「"間に挿入する文字列".join([連結したい文字列のリスト])」の形です. 今の場合, 「間に挿入する文字列」は半角空白, 連結したい文字列のリストはAの各要素を文字列型にしたものになります.

# 入力
N, X = [int(i) for i in input().split()]
A = [int(i) for i in input().split()]
# 配列A'を用意
Aprime = []
for i in range(N):
if A[i] != X:
Aprime.append(A[i])
# 出力
print(" ".join([str(i) for i in Aprime]))

C - Digital Graffiti

マスSijに対応して, 図のように格子点を定めます. 端の点に関しては考えなくてよいので, 格子点は全部で(H1)(W1)個あります.

格子点(x,y)が多角形の頂点であるのは, 以下の条件のどちらかを満たす場合です.

  • その点の周囲4マス(Sx,y, Sx+1,y, Sx,y+1, Sx+1,y+1)のうち1マスが黒に塗られている.
  • その点の周囲4マス(Sx,y, Sx+1,y, Sx,y+1, Sx+1,y+1)のうち3マスが黒に塗られている.

2マスだけが黒の場合は多角形の周の一部に対応しますし, 4マスなら多角形の内部の点, 0マスなら関係ない点になります.

以下がその例です. 図に入っている範囲では, (0,0), (1,0), (1,1)が多角形の頂点になります.

# 与えられた格子点x,yと.#の文字列Sにおいて、その周囲の4マスのうち何個が#かを調査する関数
def sharp_count(x, y, S_func):
count = 0
for k in range(x, x + 2):
for l in range(y, y + 2) :
if S_func[k][l] == "#" :
count += 1
return count
# 入力
H, W = [int(i) for i in input().split()]
S = [input() for _ in range(H)]
# 格子点のうち頂点になる数を格納
cnt = 0
# 頂点になる数を格納
# 端の格子点は考慮しない
# (W - 1)×(H - 1)個調べる
for i in range(H - 1):
for j in range(W - 1):
if sharp_count(i, j, S) == 1 or sharp_count(i, j, S) == 3:
cnt += 1
# 出力
print(cnt)

D - Circle Lattice Points

入力が高々小数点第4位までなので, 入力値に予め104をかけておけば, 精度に関して問題なく計算を行うことができます.

const=104単位で切り上げる関数と切り下げる関数をあらかじめ用意しておくと, 記述が楽になります. XR(104単位で切り上げ)からX+R(104単位で切り下げ)までの間のx座標に対して,

(1)ymin=YR2(xX)2

(104単位で切り上げ)から,

(2)ymax=Y+R2(xX)2

(104単位で切り下げ)までのy座標が, 条件に適合します(三平方の定理より). それを数え上げればよいです.

sampleは全て通ったのですが, 提出するとWAとなってしまいました(6個から10個くらい). 今の時点ではこれを改善する方法を理解できていません.

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels

Blog Archives