AtCoder ABC181
2020-11-01(日)に行われたAtCoderBeginnerContest181の問題をA問題から順に考察も踏まえてまとめたものとなります.
問題は引用して記載していますが,詳しくはコンテストページの方で確認してください.
コンテストページはこちら
公式解説PDF
A問題 Heavy Rotation
問題文
高橋くんは今、白い服を着ています。
高橋くんは、白い服を着た次の日には黒い服を、黒い服を着た次の日には白い服を着ます。
$N$日後には何色の服を着るでしょうか?
n = int(input())
if n % 2 == 0:
print("White")
else:
print("Black")
B問題 Trapezoid Sum
問題文
何も書かれていない黒板があります。 高橋くんは$N$回の操作を行い、黒板に整数を書きます。
_ $i$回目の操作では、$A_i$以上$B_i$以下の整数すべてを$1$個ずつ、合計$B_i−A_i+1$個の整数を書きます。
$N$回の操作を終えたときの、黒板に書かれた整数の合計を求めてください。
問題文に$B_i−A_i+1$個と書いてあってとても助かりました.
このあたり+1し忘れたりして,ミスること多いので(汗)
n = int(input())
total = 0
for i in range(n):
a, b = map(int, input().split())
total += (b - a + 1) * (a + b) // 2
print(total)
C問題 Trapezoid Sum
問題文
無限に広い$2$次元平面の上に$N$個の点があります。
$i$番目の点は$(x_i,y_i)$にあります。
$N$個の点の中の相異なる$3$点であって、同一直線上にあるものは存在するでしょうか?
一直線上にあるということは,三点$P_1, P_2, P_3$に対して,
$k\overrightarrow{P_1P_2}=\overrightarrow{P_1P_3}$
が成り立つ必要があるため,x成分とy成分の恒等式から$k$を消去することで,成り立つための条件式を得ることができました.
n = int(input())
x_list = []
y_list = []
for i in range(n):
x, y = map(int, input().split())
x_list.append(x)
y_list.append(y)
flag = 0
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
xi = x_list[i]
xj = x_list[j]
xk = x_list[k]
yi = y_list[i]
yj = y_list[j]
yk = y_list[k]
if (xj - xi) * (yk - yi) == (xk - xi) * (yj - yi):
flag = 1
if flag == 1:
print("Yes")
else:
print("No")
D問題 Hachi
問題文
1 〜 9 の数字のみからなる数字列$S$が与えられます。
蜂の高橋くんは、$8$の倍数が好きです。
高橋くんは、数字列$S$を並び替えて$8$の倍数を作ろうとしています。
$8$の倍数を作れるかどうか判定してください。
とある数字列が$8$の倍数となるためには,下三桁が$8$の倍数である必要がある.
そのため,三桁以上の数字列に対して,$8$の倍数である三桁を作ることができるかどうかを調べることで解くことができます.
まず,$0$を含まない$8$の倍数の数字の組み合わせを記録していき,その組み合わせに必要な数字が足りているかを確認して,判定を行いました.
もっと,シンプルなコードが書けると思いますが,提出したものをそのまま載せておきます.
s = input()
flag = 0
if len(s) == 1:
if int(s) % 8 == 0:
flag = 1
elif len(s) < 3:
if int(s) % 8 == 0:
flag = 1
if int(s[1] + s[0]) % 8 == 0:
flag = 1
else:
check_list = []
for i in range(14, 125):
mozi = str(i * 8)
if len(mozi) == 3 and "0" not in mozi:
count_list = [0] * 9
count_list[int(mozi[0]) - 1] += 1
count_list[int(mozi[1]) - 1] += 1
count_list[int(mozi[2]) - 1] += 1
check_list.append(count_list)
s_list = [0] * 9
for suuzi in s:
s_list[int(suuzi) - 1] += 1
for count_list in check_list:
total = 0
for i in range(9):
if count_list[i] > 0:
if count_list[i] <= s_list[i]:
total += count_list[i]
if total == 3:
flag = 1
break
if flag == 1:
print("Yes")
else:
print("No")
今回,D問題までいいペースで解けたのですが,E問題がどうしても'WA'に阻まれて解けませんでした.
方針はあっていたので,次はしっかり解けるようにしたいと思います.
最後まで読んでいただきありがとうございました.