こんにちは, Shinoryoです.
今回はAtCoder Beginner Contest 197(Sponsored by Panasonic)を, Pythonで解いてみた結果を書き連ねていこうと思います.
AtCoder Beginner Contest 197(Sponsored by Panasonic) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
A - Rotate
入力する文字列を
# 入力 | |
S = input() | |
# 出力 | |
print(S[1:]+S[0]) |
B - Visibility
マス目
# 入力 | |
H, W, X, Y = [int(x) for x in input().split()] | |
S = [input() for _ in range(H)] | |
# X, Yをindexに合わせて-1 | |
X -= 1 | |
Y -= 1 | |
# 答えを格納する変数 | |
ans = 1 | |
# 上方向 | |
for x in range(X-1, -1, -1): | |
if S[x][Y] == "#": | |
break | |
else: | |
ans += 1 | |
# 下方向 | |
for x in range(X+1, H, 1): | |
if S[x][Y] == "#": | |
break | |
else: | |
ans += 1 | |
# 左方向 | |
for y in range(Y-1, -1, -1): | |
if S[X][y] == "#": | |
break | |
else: | |
ans += 1 | |
# 右方向 | |
for y in range(Y+1, W, 1): | |
if S[X][y] == "#": | |
break | |
else: | |
ans += 1 | |
# 出力 | |
print(ans) |
C - ORXOR
区分けの仕方は, それぞれの数の間にあると仮定する
下のコードでは,

Pythonでは論理和(OR)(|演算子)と排他的論理和(XOR)(^演算子)があるので, それを用いることで計算をすることができます.
なお, 下のコードはPyPy3でACとなります. Python3だとTLEでした.
# 入力 | |
N = int(input()) | |
A = [int(x) for x in input().split()] | |
# 答えを格納する変数 | |
# A < 2^30なので、2^30よりは小さい | |
ans = 1 << 30 | |
# ループ | |
# 2^(N-1)回分(区間に分ける場合の数) | |
for i in range(1 << (N-1)): | |
# ored: 分けた区間内の数のビット単位ORを格納する変数 | |
# xored: 得られた全ての値のビット単位XORを格納する変数 | |
ored = A[0] | |
xored = 0 | |
# A[1]からA[N-1]までのA[j]に関する処理 | |
for j in range(1, N): | |
# 区間の分け方iの右から(j-1)番目が1(つまり、仕切りを入れる)かのチェック | |
if (i >> (j - 1)) & 1: | |
# 仕切りが入っている場合の処理 | |
xored ^= ored # XOR演算 | |
ored = A[j] | |
else: | |
# 仕切りが入っていない場合の処理 | |
ored |= A[j] # OR演算 | |
# 最後のXOR演算 | |
xored ^= ored # XOR演算 | |
# ansを更新 | |
ans = min(ans, xored) | |
# 出力 | |
print(ans) |
D - Opposite
任意の正多角形に対してある円が存在し, その正多角形はその円に内接するようにできます.
座標の回転は行列(あるいは, 複素数平面など)を用いて考えます.
となることに注意してください. Pythonにおいて,
import math | |
# 点x、点x_0、角度(rad)を受け取って、 | |
# 点x_0を中心にその角度だけ反時計回りに点xを回転させた座標(x_1, y_1)を返す関数 | |
def rotate(x, x_0, angle): | |
x_1 = math.cos(angle)*(x[0] - x_0[0]) - math.sin(angle)*(x[1] - x_0[1]) + x_0[0] | |
y_1 = math.sin(angle)*(x[0] - x_0[0]) + math.cos(angle)*(x[1] - x_0[1]) + x_0[1] | |
return [x_1, y_1] | |
# 入力 | |
N = int(input()) | |
p_0 = [int(x) for x in input().split()] | |
p_N2 = [int(x) for x in input().split()] | |
# 正多角形の中心qを求める | |
q = [(p_N2[0] + p_0[0])/2, (p_N2[1] + p_0[1])/2] | |
# 求める点は、qを中心にp_0を(2*Pi/N)だけ反時計回りに回転させた点 | |
p_1 = rotate(p_0, q, 2*math.pi/N) | |
# 出力 | |
print(p_1[0], p_1[1]) |
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - AtCoder Beginner Contest 197(Sponsored by Panasonic)」
Editorial - AtCoder Beginner Contest 197(Sponsored by Panasonic)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- nkmk様による「Pythonのビット演算子(論理積, 論理和, 排他的論理和, 反転, シフト)」
Pythonのビット演算子(論理積, 論理和, 排他的論理和, 反転, シフト) | note.nkmk.me
Pythonには&, |, ^, ~, <<, >>のビット演算子が用意されており, 2進数で表した整数型intの値の各ビットに対して, それぞれ論理積, 論理和, 排他的論理和, ビット反転, 左ビットシフト, 右ビットシフトを行う. ここでは, 論理積(AND): &演算子 論理和(OR): |演算子 排他的論理和(XOR): ^演算子 について説明してから, ...
- nkmk様による「Pythonで三角関数を計算(sin, cos, tan, arcsin, arccos, arctan)」
Pythonで三角関数を計算(sin, cos, tan, arcsin, arccos, arctan) | note.nkmk.me
Pythonの数学関数の標準モジュールmathを使うと, 三角関数(sin, cos, tan)および逆三角関数(arcsin, arccos, arctan)の計算ができる. 9.2. math — 数学関数 三角関数 — Python 3.6.4 ドキュメント ここでは, 以下の内容についてサンプルコードとともに説明する. 円周率(パイ): math.pi 角度変換(ラジアン, 度): m...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)