水色コーダーを目指す取り組みをしてきました。
悔しいので、3ヶ月の延長戦を設定して続けることにしました。
期間は2022年9月から、12月までの3ヶ月としました。
学習の方針
e869120さんの記事を参考に学習の方針を立てます。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】
上の記事によると、水色コーダー(レーティング1200)の条件はこんな感じのようです。
AtCoder で水色コーダー、つまりレーティング 1200 に到達するには、
- AtCoder Beginner Contest で確率 8 割以上で 4 問正解できる
- AtCoder Beginner Contest で確率 3-4 割で 5 問正解できる
- AtCoder Beginner Contest の問題をある程度早く解くことができる
- 目安は、A 問題 1 分、B 問題 4 分、C 問題 10 分、D 問題 25 分
A~D問題を50分以内目安で解くことが必要とのことです。
B問題4分、C問題10分が次の壁となりそうです。
アルゴリズム学習
こちらの記事を見て、水色に到達するために何が必要か考えました。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】
解説されている基本アルゴリズム12個を学習します。
今週の学習内容はこちらです。
一通り学習したアルゴリズムは灰色、今週学習したものを太字にしています。
全探索 | 二分探索 | 深さ優先探索 (DFS) | 幅優先探索 (BFS) |
動的計画法 (DP) | ダイクストラ法 | ワーシャルフロイド法 | クラスカル法 |
高速な素数判定法 | べき乗を高速に計算する手法 | 逆元を計算する手法 | 累積和 |
DP
DPはこちらの記事で学習し、問題を数問解いて感触を掴みました。
アルゴリズム学習
典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~
動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集
問題演習(A~E)
Educational DP Contest / DP まとめコンテスト
データ構造学習
データ構造3つを学習します。
一通り学習した構造は灰色、今週学習したものを太字にしています。
グラフ | 木 | Union-Find |
筆者の学習歴
学習歴はこんな感じです。
・利用言語はPython3
・Pythonの利用は業務で少し
・学習は「みんなのPython」を読んだくらい
・ABCコンテストには数回参加した(解けるのは1〜2問)
競プロではC++を使う方が多いかと思いますが、筆者はPythonのシンプルさに感動したためPythonで取り組みます。
毎週のAtCoder Beginner Contest(ABC)をペースメーカーにしていきます。
今週のコンテスト
ABC274
ABCに参加してきました。
3問AC、茶色パフォーマンスでした。
AC:3問
パフォーマンス:664
レーティング:389→419(+30)
段級位:8級
結果
Batting Average
バッターの打率を少数4桁を四捨五入して出力せよ
6分13秒時点(所要時間6分13秒)でACしました。
少数部を3桁並べる必要があるのが注意点です。
a,b=map(int,input().split())
s=b/a
print("{:,.3f}".format(s))
Line Sensor
格子が与えられる。
各列にある”#”の数を出力せよ
17分16秒時点(所要時間11分3秒)でACしました。
列を探索する処理方法に少してこづりました。
処理は、素直な全探索でOKです。
H,W=map(int,input().split())
a = [list(input()) for l in range(H)]
b=[0]*W
#print(a)
#print(a[0][1])
for i in range(W):
for j in range(H):
if a[j][i]=="#":
b[i]+=1
print(*b)
Ameba
分裂するアメーバがある。
各アメーバが何代目のアメーバか出力せよ。
37分36秒時点(所要時間20分30秒)でACしました。
i番目のアメーバは、2iと2i+1のアメーバになる条件で計算します。
アメーバの世代数を記録し、N回分遡る処理で計算しました。
N=int(input())
A = list(map(int, input().split()))
B=[0]*(2*N+2)
for i in range(1,N+1):
B[2*i]=B[A[i-1]]+1
B[2*i+1]=B[2*i]
for i in range(1,len(B)):
print(B[i])
Robot Arms 2
数列が与えられる。
XY平面上で、各数列について、その数の正か負を選びX方向あるいはY方向に移動する。
開始地点から終了地点まで移動できるか出力せよ。
60分ほど試行錯誤しましたが、ACできませんでした。
Nが1,000までありうるので、素直なbit全探索ではTLEすると考えました。
正負の値を集合に足していく処理で良かったようです。
def solve(n, x, y, a):
for p, ds in [(x, a[1::2]), (y, a[0::2])]:
#print(p,ds)
que = [p]
#print(que)
for d in ds:
S = set()
for c in que:
S.add(c + d)
S.add(c - d)
que = list(S)
#print(que)
if not 0 in que:
return "No"
return "Yes"
n, x, y = map(int, input().split())
a = list(map(int, input().split()))
x -= a[0]
a = a[1:]
print(solve(n, x, y, a))
次の目標
目標:緑色パフォーマンスを出せるようにする
緑色昇級のため、目標を整理しました。
・A・B問題を高速で解く(理想5〜10分以内)
・C・D問題をどちらかあるいは両方解く
安定して茶色パフォーマンスを出し、早いうちに緑色パフォーマンスを目指します。