【AtCoder】ABC234解説(Python)

AtCoder Beginner Contest 234の解説記事です。

目次

ABC234 A – Weird Function

問題

問題文の要約は以下の通りです。

問題の要約

\(f(x)=x^2+2x+3\)とする。
整数 \(t\) に対して \(f(f(f(t)+t)+f(f(t)))\) を求めよ。

制約

・\(t\) は \(0\) 以上 \(10\) 以下の整数

入力

\(t\)

出力

答えを整数として出力せよ。

解説

関数f(x)を定義を定義する。

解説

まず、関数f(x)を定義します。\(f(x)=x^2+2x+3\) なので戻り値としてreturn x**2+2*x+3と定義します。

# f(x)を定義
def f(x):
    return x**2+2*x+3

入力 \(t\) をint型として受け取ります。

# 入力
t=int(input())

最後に \(f(f(f(t)+t)+f(f(t)))\) を出力します。

# 出力
print(f(f(f(t)+t)+f(f(t))))

解答

# f(x)を定義
def f(x):
    return x**2+2*x+3

# 入力
t=int(input())

# 出力
print(f(f(f(t)+t)+f(f(t))))

ABC234 B – Longest Segment

問題

問題文の要約は以下の通りです。

問題の要約

二次元平面上に \(N\) 個の点があり、\(i\) 個目の点の座標を \((x_i,y_i)\) とする。この中から2つの点を選ぶとき、それらを結ぶ線分の長さの最大値を求めよ。

制約

・\(2 \le N \le 100\)
・\(-1000 \le x_i,y_i \le 1000\)
・\((x_i,y_i) \ne (x_j,y_j) (i \ne j)\)
・入力はすべて整数

入力

\(N\)
\(x_1\) \(y_1\)
\(x_2\) \(y_2\)
\(\vdots\)
\(x_N\) \(y_N\)

出力

2点を結ぶ線分の長さの最大値を出力せよ。

解説

全ての線分を考え、長さが最大のものを出力する。

解説

まず、長さを求める平方根の計算にmath.sqrtを使用するためimport mathを行います。
そして、入力 \(N\) をint型として受け取り、答えの変数ansを初期値0で用意します。

# math.sqrtを使用するためmathをimport
import math

# 入力
N=int(input())

# 答えの初期値0
ans=0

次に各座標を配列で受け取ります。

# 入力(各座標)(x_i,y_i)=(XY[i][0],XY[i][1])
XY=[[0]*2 for i in range(N)]
for i in range(N):
  XY[i][0],XY[i][1]=map(int,input().split())

各線分の長さを計算して、最大のものをansとします。

各線分の長さは \(\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}\) で求められます。

# 線分の長さを計算
for i in range(N):
  for j in range(i+1,N):
    ans=max(ans,math.sqrt((XY[i][0]-XY[j][0])**2+(XY[i][1]-XY[j][1])**2))

最後に答えを出力します。

# 答えを出力
print(ans)

解答

# math.sqrtを使用するためmathをimport
import math

# 入力
N=int(input())

# 答えの初期値0
ans=0

# 入力(各座標)(x_i,y_i)=(XY[i][0],XY[i][1])
XY=[[0]*2 for i in range(N)]
for i in range(N):
  XY[i][0],XY[i][1]=map(int,input().split())

# 線分の長さを計算
for i in range(N):
  for j in range(i+1,N):
    ans=max(ans,math.sqrt((XY[i][0]-XY[j][0])**2+(XY[i][1]-XY[j][1])**2))

# 答えを出力
print(ans)

ABC234 C – Happy New Year!

問題

問題文の要約は以下の通りです。

問題の要約

10進法で表記したときに \(0\), \(2\) のみからなる正整数のうち、\(K\) 番目に小さいものを求めよ。

制約

・\(K\) は \(1\) 以上 \(10^{18}\) 以下の整数

入力

\(K\)

出力

答えを整数として出力せよ。

解説

条件は2進数を2と0で表現したものになります。
つまり、\(K\) を2進数に変換して1を2に置換したものが答えです。

解説

入力 \(K\) をint型として受け取ります。

# 入力
K=int(input())

 \(K\) を2進数に変換します。

# 2進数に変換
K=bin(K)

2進数からプレフィックス0bを削除します。

# プレフィックス0bを削除
K=K[2:]

1を2に置換します。

# 1を2に置換
K=K.replace('1', '2')

最後に答えを出力します。

# 出力
print(K)

解答

# 入力
K=int(input())

# 2進数に変換
K=bin(K)

# プレフィックス0bを削除
K=K[2:]

# 1を2に置換
K=K.replace('1', '2')

# 出力
print(K)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次