年が明けて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"))
コメント