ABC259の振り返り(A, B, C, D)
C問題をACできなかった因縁の回。
というわけで振り返りです。
A - Growth Record
やってみよう!
A
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
こんな感じ
def A(N, M, X, T, D): return T - D * (X - M) if M < X else T test_all(A)結果:提出 #34108134
自由欄
def A(N, M, X, T, D): return ([T]*(N-X)+[T-D*i for i in range(X+1)])[::-1][M] test_all(A)結果:
B - Counterclockwise Rotation
やってみよう!
B
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
コンテスト中の提出はひどいものだったので、改めてこんな感じ。
回転行列を作ってnumpyで行列とベクトルの積を計算してます。
実際これぐらいの計算であればnumpyも不要ですが。
結果:提出 #34126212
回転行列の復習
個人的な理解なので、検索したらもっと分かりやすい説明があると思います。
点$(a, b)$の原点との距離を$r$、x軸からの角度を$\phi$とします。ここで、$
\begin{pmatrix}
a \\
b
\end{pmatrix} = \begin{pmatrix}
r \cos\phi \\
r \sin\phi
\end{pmatrix}
$ です。
原点を中心に$\theta$だけ回転させた点$(a', b')$は以下のようになります。
$$ \begin{aligned} & \begin{pmatrix} a' \\ b' \end{pmatrix} && \\ = \:&\: \begin{pmatrix} % 極座標から直交座標 r\cos\big(\phi+\theta\big) \\ r\sin\big(\phi+\theta\big) \end{pmatrix} && 極座標系から直交座標系に変換\\ = \:&\: \begin{pmatrix} % 加法定理 r\big(\cos\phi\cos\theta - \sin\phi\sin\theta\big) \\ r\big(\sin\phi\cos\theta + \cos\phi\sin\theta\big) \end{pmatrix} && 加法定理\\ = \:&\: \begin{pmatrix} a\cos\theta - b\sin\theta \\ b\cos\theta + a\sin\theta \end{pmatrix} && \\ = \:&\: \begin{pmatrix} \cos\theta & -\sin\theta \\ \cos\theta & \sin\theta \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix} && \end{aligned} $$
自由欄
C - XX to XXX
やってみよう!
C
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
コンテスト中にACできなかったが、その後当日中にACしてたらしい。(記憶がない)
その時の提出を見てもあまり読む気にならないようなコーディングなので改めてやってみたのが以下。
だいたい解説と同じような実装になりました。
def enc(s): ret = [["", 0]] for c in s: if c == ret[-1][0]: ret[-1][1] += 1 else: ret.append([c, 1]) return ret def C(S, T): s = enc(S) t = enc(T) if len(s) != len(t): return "No" for c1, c2 in zip(s, t): # 文字が違う if c1[0] != c2[0]: return "No" # 同じ文字、同じ数 if c1[1] == c2[1]: continue # Sの文字数が多ければNG if c1[1] > c2[1]: return "No" # Tの文字数が多いけどSの文字数が2未満だと操作できないのでNG if c1[1] < 2: return "No" return "Yes" test_all(C)結果:提出 #34153172
場当たり的にロジックを組んでたらバグる、そしてちゃんとしたロジックを組むために最適なデータ構造を選ばなければならない、という教訓の1問です。
自由欄
D - Circumferences
やってみよう!
D
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
せっかくなのでコンテスト中は見ることもなかったD問題もやってみます。
なんだか小難しそうですが、全ての円の中心と点s, tを頂点とするグラフを作りながら全探索すればよいのでは?
というわけで以下。
結果:提出 #34189988
自力ACできた!解説の考え方とも大差なさそうです。
自由欄
まとめ
1ヶ月ちょっとの間でも自分の成長を感じる今日このごろ。
「振り返ってできる」から「本番でできる」まで成長せねば!