AtCoder Beginner Contest 185をPythonで解く

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

Atcoder Python

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

こんにちは, Shinoryoです.

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

A - ABC Preparation

単純に, A1, A2, A3, A4の最小値を出力します.

print(min([int(x) for x in input().split()]))

B - Smartphone Addiction

問題文に従って, カフェに入る前および帰宅したときのバッテリー残量を調べ, 0以下かどうか判定します. 最大容量以上にバッテリーは充電されないことに注意して, 充電の処理をしてください.

N, M, T = [int(x) for x in input().split()]
# 最大容量の記録用
Nmax = N
# カフェを出た時刻の記録用
Bbefore = 0
for i in range(M):
A, B = [int(x) for x in input().split()]
# カフェに入る前に, 時間(A - Bbefore)だけ外出している
N -= A - Bbefore
# バッテリー判定
if N <= 0:
print("No")
exit()
# カフェには時間(B-A)だけ滞在している
# 最大容量以上にバッテリーは充電されないことに注意
N = min(N + B - A, Nmax)
# カフェを出た時刻を記録して, 次の計算に用いる
Bbefore = B
# カフェを出てから帰宅するまで, 時間(T - Bbefore)だけ外出している
N -= T - Bbefore
# バッテリー判定(帰宅時の判定)
if N <= 0:
print("No")
else:
print("Yes")

C - Duodecim Ferra

求めるものはすなわち, 切る場所の候補L1個から, 実際に切る11個を選ぶ場合の数になります. Python3の整数int型には最大値はないことになってはいますので, 下のコードで問題はありません. 場合によっては, オーバーフローしないようにする処理が必要になるでしょう.

import math
# 入力
L = int(input())
# 求めるのは(L-1)C(11)
# (L-1)個の分割候補から, 11個を選ぶ組み合わせ
print(math.factorial(L - 1) // (math.factorial(L - 12) * math.factorial(11)))

D - Stamp

マス目の中で白色のマスが連続しているところの白色のマスの個数を, 左からx1, x2, …, xnとする. ハンコの幅kに関して, x1, x2, …, xnの中にkより小さいものがあると, 目標を達成することはできません. kはなるべく大きなものを使った方が良いので, kの値として適切なのは, x1, x2, …, xnの最小値であることが分かります.

最終的に求めるのは,

(1)i(xi/kの小数第1位を切り上げた値)

になります. 白色のマスが存在しない場合の処理を別途行う必要があることに注意してください.

# 入力, 後のためにAはソートしておく
N, M = [int(x) for x in input().split()]
A = sorted([int(x) for x in input().split()])
# whitelist:白色のマスが何個連続して並んでいるかのリスト
# 青白白青白青白白白 なら [2,1,3]が入る
whitelist = list()
# tempはwhitelistの構築に使用する一時変数
temp = 1
# Aの各要素に対し, そのマスより左側に連続して並んでいる白色のマスの個数を調べる
for i in A:
if i - temp > 0:
whitelist.append(i - temp)
temp = i + 1
# 端のマスの処理
if N + 1 - temp > 0:
whitelist.append(N + 1 - temp)
# もし白色のマスが存在しない場合の処理
if whitelist == []:
print(0)
# そうでなければ……
else:
# kはwhitelistの要素のうち最小のものに等しい
k = min(whitelist)
# ハンコを押す必要のある回数を調べる
ans = 0
for j in whitelist:
ans += j // k
if j % k != 0:
ans += 1
print(ans)

E以降

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

参考にしたサイト等

Search

About Me

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

Labels

Blog Archives