ABC234参戦記

プログラミング

年が明けて1回目のコンテストであるABC234に参加した記録です。

今年も参加したコンテストのABCまでの振り返り記事を書いていこうと思います。
使用言語はPython3です。レートは茶色の真ん中あたりです。

A – Weird Function

関数が書けますか。が問われる問題。
ここ最近のA問題とは違った傾向の問題でした。
今までのA問題の傾向としては、if文を書けたらAC(正解)出来る感じの問題が多かったので、今回が5回目の参加の方とかは面食らった感じかと思います。

関数を問題文の通りに作成して、あとは、問題文にある式の通りに計算した値を変数に保持して、変数の値を出力すればOKですね。

# AtCoder Beginner Contest 234
# A - Weird Function

# 関数の定義
def f(x):
    return x**2+2*x+3

# 入力をint型で受取
t = int(input())

# 求める式の結果を変数ansに保持
ans = f(f(f(t)+t)+f(f(t)))

# 答えを出力
print(ans)

一応、問題の制約から、手計算して答えを求めておいて、if文や、配列を利用しても解けますね。

if文で11通りの場合分けしたACコードです。

# 入力をint型で受け取る
t = int(input())

# 場合分けして答えを出力
if t==0: print(1371)
if t==1: print(13926)
if t==2: print(119027)
if t==3: print(722502)
if t==4: print(3286971)
if t==5: print(11985446)
if t==6: print(36881331)
if t==7: print(99400902)
if t==8: print(241025627)
if t==9: print(536292966)
if t==10: print(1111355571)

配列を利用したら、if文のコードより、少しすっきりするようにも思います。

# 入力をint型で受け取る
t = int(input())

# tが0から10までの場合の配列を用意する
ls=[1371, 13926, 119027, 722502, 3286971, 11985446, 36881331, 99400902, 241025627, 536292966, 1111355571]

# 答えを出力
print(ls[t])

B – Longest Segment

組み合わせを全通り試せるかと、2点間の直線距離を求められるかが問われる問題。

B問題で2点間の距離を求める際には、2点間の距離を求める式が載っているイメージがありましたが、今回の問題はなかったので、知らなかった方はググって調べる必要がありましたね。

2点間の距離を求める関数を用意して、あとは全通りの組み合わせを試して距離を求め、今まで調べた距離の最大値よりも大きい場合は、更新していけばOKですね。

全通りの組み合わせについては、2重のfor文でも、 itertools の中の combinations を使うのでも良いですね。

# AtCoder Beginner Contest 234
# B - Longest Segment	

# 2点(A,B)間の距離を返す関数
def f(A, B):
    x1, y1 = A
    x2, y2 = B
    res = (x1-x2)**2 + (y1-y2)**2
    res = res**0.5
    return res

# 入力の受け取り
N = int(input())
points=[]
for _ in range (N):
    x,y=map(int,input().split())
    points.append((x,y))

# 答え用の変数
ans = 0

# 重複含めて、全通り試す
for i in range (N):
    for j in range (N):
        A = points[i]
        B = points[j]
        dist = f(A,B) # 上記関数を利用し、距離を計算
        ans = max(ans,dist) # 答え用の変数を更新

# 答えを出力
print(ans)

私は、コンテス中は、combinations を利用して提出しました。

from itertools import combinations

# 2点(A,B)間の距離を返す関数
def f(A, B):
    x1, y1 = A
    x2, y2 = B
    res = (x1-x2)**2 + (y1-y2)**2
    res = res**0.5
    return res

# 入力の受け取り
N = int(input())
points=[]
for _ in range (N):
    x,y=map(int,input().split())
    points.append((x,y))

# pointsから異なる2点の組み合わせをcombinationsで作成
cmb = list(combinations(points,2))

# 答え用の変数
ans = 0

# cmb から、組み合わせを1つずつ取り出して処理
#   各組み合わせには、(A,B)という形で入っている
for A,B in cmb:
    dist = f(A,B) # 上記関数を利用し、距離を計算
    ans = max(ans, dist) # 答え用の変数を更新

# 答えを出力
print(ans)

C – Happy New Year!

二進数にできますか。が問われる問題。

利用できる文字は0と2の二種類のため、二進数で数を表します。その後、その数の1の部分を2に置き換えればOKですね。

コンテスト後ではありますが、どこかで見たことあるな。と思って思い返していたら、応用情報の過去問で同様の問題が出ていたことを思い出しました。

応用情報技術者令和元年秋期 午前問1

応用情報の勉強は競プロの役に立つ!いや、逆かな。競プロは応用情報の役に立つ!
(実際には、ほぼ全てのことが何らかの役に立つ。と思いますが。。。)

# AtCoder Beginner Contest 234
# C - Happy New Year!

K = int(input())

ans = []

# 二進数にする
#   但し、使用する文字は"0"と"2"
while K > 0:
    a = K%2
    if a == 0:
        ans.append("0")
    else:
        ans.append("2")
    K //= 2

# 配列の並びを逆順にする
ans = ans[::-1]

# 配列内の文字列を結合して出力
print("".join(ans))

bin() を利用すると、もっと簡単に書くことができますね。
コンテスト中は、入力が大きいため、bin() で扱える数なのかがわからず、上記コードで提出しましたが、十分下のコードでもAC(正解)出来ました。

K = int(input())
ans = bin(K)[2:]
print(ans.replace("1","2"))

コメント

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