ABC180参戦記

プログラミング

急遽開催が決定し、しかも、いつもの21時スタートとは違い、20時スタートとなったABC180

こどもを19時半に寝かせつけ参加しました!
寝かしつけでよく私も寝てしまうので、危なかったです。

本ブログはABCのC問題が解けるか解けないか位のスキルの灰色コーダーの私が、ABCのC問題までを私が理解した内容を基に記載しているものです。
使用言語はPython3です。

自分がまだまだ初級者クラスのため、難しいことは理解できていません。
ABCのC問題までは理解できるまで頑張ってます。C問題までをここでは私の理解とともに書いていきます。

A – box

標準入出力と、四則演算(今回は加算と減算)の取り扱いを問われる問題。

複数の変数を1行で受け取るまでに私は苦労しました。

Python3では、map()を使用して受け取るのが良いと思います。

# AtCoder Beginner Contest 180
# A - box

N,A,B=map(int,input().split())

print(N-A+B)

B – Various distances

繰り返し処理と累乗、平方根、絶対値の取り扱いができるかを問われる問題。

関数を作成して回答したほうがすっきりする気がしたため、関数を作成しメインとなる部分は作った関数の戻り値だけを出力するようにしました。

# AtCoder Beginner Contest 180
# B - Various distances

def ManhattanDistance(N,ls):
    ans=0
    for i in range (N):
        ans+=abs(ls[i])
    return ans

def EuclideanDistance(N,ls):
    ans=0
    for i in range (N):
        ans+=ls[i]*ls[i]
    return ans**0.5

def ChebyshevDistance(N,ls):
    ans=0
    for i in range (N):
        if abs(ls[i])>ans:
            ans=abs(ls[i])
    return ans


N=int(input())
xls=list(map(int,input().split()))

print(ManhattanDistance(N,xls))
print(EuclideanDistance(N,xls))
print(ChebyshevDistance(N,xls))

関数名の長さがそろっててきれい!

C – Cream puff

約数をO(N)よりも高速で求める方法を問われる問題。

整数Nを1から順に割っていて、余りが0であればその数はNの約数です。この方法ではO(N)かかるため、今回の制約10**12は間に合いません。
整数Nをiで割った時の商をqとした時、余りが0であれば、N=i×qが成り立っているため、iに加えてqもNの約数です。
Nの平方根まで調べれば、i≦qの状態約数が列挙できます。
これらの約数を答えようのsetに追加していって、listに変換。昇順にソートして、for文で各要素を出力したらOKです。

# AtCoder Beginner Contest 180
# C - Cream puff

N=int(input())
ans=set()

for i in range (1,int(N**0.5)+1):
    if N%i==0:
        ans.add(i)
        ans.add(N//i)
ans=list(ans)
ans.sort()
for i in range (len(ans)):
    print(ans[i])

ちなみに、listのsort()で少し時間がかかるので、もっと高速に計算するためには、この記事などが参考になります。

私はwhileとforでは、for文を使うほうが好きなため、for文で書いてます。
平方根の誤差とかはわかりません。

コメント

タイトルとURLをコピーしました