AtCoder Beginner Contest 187をPythonで解く

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

Atcoder Python

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

こんにちは, Shinoryoです.

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

A - Large Digits

数字をint型に変換せず文字列で取得します. 文字列はリストのように○番目の文字を取り出すことができるので, それを利用して各桁の数字の合計を計算します. その後, 大小判定を行います.

# 文字列の数字を入力して、各桁の数字の合計を出力する関数
def digit_sum(str_number):
sum = 0
for i in range(len(str_number)):
sum += int(str_number[i])
return sum
# 文字列として入力
A, B = [x for x in input().split()]
# 各桁の数字の合計を計算
sum_A = digit_sum(A)
sum_B = digit_sum(B)
# 大小判定と出力
if sum_A < sum_B:
print(sum_B)
else:
print(sum_A)

B - Gentle Pairs

2つの点の組み合わせの全パターンを出し, それぞれに関して傾きが1以上1以下であるかを計算します. 傾きの計算の際にはx座標の差の絶対値とy座標の差の絶対値を比べるようにすれば, 整数の範囲内での計算で済みます.

import itertools
# 入力
N = int(input())
xymatrix = [[int(x) for x in input().split()] for _ in range(N)]
# 答えを格納する変数
ans = 0
# 2つの点の組み合わせの全パターンを計算
for xy1,xy2 in itertools.combinations(xymatrix,2):
if abs(xy1[0] - xy2[0]) >= abs(xy1[1] - xy2[1]):
ans += 1
# 出力
print(ans)

C - 1-SAT

不満な文字列であるための必要条件として, その文字列はS1,S2,,SNのどれかであるということが挙げられます. よって, S1,S2,,SNに対して, それらの先頭に!を付けたものがS1,S2,,SNに存在するかを確認します.

S1,S2,,SNにある文字列が存在するのを確認する「item in seq」の演算にかかる時間計算量は, list型がO(N)でset型がO(1)です. したがって, set型で扱った方が実行時間が短くて済みます. 実際, list型で行うとTLEです.

# 入力
N = int(input())
# listではなくset
Slist = {input() for _ in range(N)}
# Slistに含まれる文字列を全探索
for searchword in Slist:
# !を付けたものがSlistに存在するなら、searchwordを出力し終了
if "!"+searchword in Slist:
print(searchword)
exit()
# 求めるものがなければsatisfiableを出力
print("satisfiable")

D - Choose Me

XとしてX=(高橋氏の得票数青木氏の得票数)を考え, これが正になるかどうかを判定にします.

「高橋氏がある町で演説を行わなかった場合, その町の青木派は全員青木氏に投票し, 高橋派は投票に行きません」ので, Xの初期値は1×(全青木派有権者数)です. そして, 「高橋氏がある町で演説を行った場合, その町の高橋派も青木派も全員高橋氏に投票します」ので, i番目の町で演説をした場合, X2Ai+Biだけ増加します.

したがって, 2Ai+Biの大きい順にソートして, 順番に加えていけばよいです. ソートに時間計算量がO(NlogN)だけかかります.

# 入力
N = int(input())
yuukensha = [[int(x) for x in input().split()] for _ in range(N)]
# X=高橋票-青木票の数を考える
# 初期Xは-1*(全青木派有権者)
X = 0
for i in range(N):
X -= yuukensha[i][0]
# i番目の町で演説をすると、Xは2A_i+B_i増える
# 演説する数をなるべく減らしたいので、
# 2A_i+B_iのリストをつくりソートする
enzetsu_kouka = sorted([2*yuukensha[i][0] + yuukensha[i][1] for i in range(N)], reverse=True)
# 答えを格納する変数
ans = 0
# Xに2A_i+B_iを大きい順に足していく
# X>0になったら終了
for i in range(N):
X += enzetsu_kouka[i]
ans += 1
if X > 0:
print(ans)
exit()
# 全ての町で演説したら必ず勝つのでここに来ることはないけど一応
print("error")

E以降

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

参考にしたサイト等

Search

About Me

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

Labels

Blog Archives