期間は6ヶ月(25週間)とし、水色コーダーを目指します。
C・D問題攻略のためアルゴリズム別学習を進めます。
今週学習したこと
アルゴリズムの分野別学習を進めました。
・全探索の問題を10問
・「Pythonプロフェッショナル大全」を学習
さらに@e869120さんの記事で分野別学習を始めました。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】
基本アルゴリズム12個を学ぶと良いようです。
各記事ボリュームがありますが、まずは12個基本を押さえます。
全探索 | 二分探索 | 深さ優先探索 (DFS) | 幅優先探索 (BFS) |
動的計画法 (DP) | ダイクストラ法 | ワーシャルフロイド法 | クラスカル法 |
高速な素数判定法 | べき乗を高速に計算する手法 | 逆元を計算する手法 | 累積和 |
問題を素直に実装すれば解ける問題(全探索)をコンテストで解けていないように感じたので、全探索の練習をしました。
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】の「全探索の問題」を解きました。
筆者の学習歴
学習歴はこんな感じです。
・利用言語はPython3
・Pythonの利用は業務で少し
・学習は「みんなのPython」を読んだくらい
・ABCコンテストには数回参加した(解けるのは1〜2問)
競プロではC++を使う方が多いかと思いますが、筆者はPythonのシンプルさに感動したためPythonで取り組みます。
今日が2022年8月21日(日)で、9月20日までの半年の期間で学習を進めます。
毎週のAtCoder Beginner Contest(ABC)をペースメーカーにしていきます。
今週のコンテスト
ABC265
ABCに参加してきました。
3問AC、茶色パフォーマンスでした。
A、B、C問題を解き切りました。
AC:1問
パフォーマンス:539
レーティング:392→408(+16)
段級位:9級
まだまた初心者ですが、茶色コーダーになれたのは達成感がありました!
結果
Middle Letter
与えられた文字列の真ん中の文字を出力せよ
1分30秒でACしました。
S=list(input())
n=len(S)
a=n//2
print(S[a])
Modulo Number
整数Nが与えられる。
N-xが998245343の倍数になるようなxを求めよ。
なお、xは0以上998245343の整数である。
14分30秒(トータル16分)でACしました。
998243534という数が大きいので、全探索するとTLEすることが想像できました。
方法を考えていて、最初にNを998245343で割った余りを出せば良いことに気づきました。
N=int(input())
K=998244353
a=N%K
print(a)
Convex Quadrilateral
四角形の座標4点が与えられる。
与えられた四角形が凸四角形かどうかを判定せよ
99分30秒(トータル85分)でACしました。
xy = [map(int, input().split()) for _ in range(4)]
x, y = [list(i) for i in zip(*xy)]
a=[x[0],y[0]]
c=[x[1],y[1]]
b=[x[2],y[2]]
d=[x[3],y[3]]
r=(d[1]-c[1])*(c[0]-a[0])-(d[0]-c[0])*(c[1]-a[1])
s=(b[1]-a[1])*(c[0]-a[0])-(b[0]-a[0])*(c[1]-a[1])
t=(b[0]-a[0])*(d[1]-c[1])-(b[1]-a[1])*(d[0]-c[0])
if t==0:
print('No')
exit()
else:
x=r/t
y=s/t
if 0 < x and x <= 1 and 0 < y and y <= 1:
print('Yes')
exit()
else:
print('No')
残り時間はこの問題に取り組みました。
四角形なので対角線が2本できますが、その対角線が交差すれば凸四角形、交差しなければ凸四角形ではないです。
2つの対角線はベクトルとして出し、交差する条件は検索して調べました。
次の目標
今回のコンテストは、ABCが茶色パフォーマンス(539)でした。
成長を感じる結果でよかったです。
目標:緑色パフォーマンスを出せるようにする
茶色昇級のため、目標を整理しました。
・A・B問題を高速で解く(理想5〜10分以内)
・C・D問題をどちらかあるいは両方解く
念願の茶色昇級ができたので、次は緑色パフォーマンスを目指します。