AtCoder Beginner Contest 183 参加ログ・感想
個人的に試験を受けた日だったのと、携帯の機種変があったので開始時間に間に合わず今回は不参加。あとから復習した
内容
- Python3でやっている。
- 参加ログ。
- 所感。
- コンテスト中に何を考えたか。
- コンテスト後に解説をみたり、少し整理したりしたくらいの内容。
- 問題の詳細で細かく書こうと思うものは別記事とする。
結果
多分本番だとCまでできたかなくらい。 Bが幾何のネタだったのは珍しい感じがした。
どう考えたか + α
A - ReLU
問題タイプ:条件分岐 文意からより大きければ 以下であればとすればいい
x = int(input()) if x > 0: print(x) else: print(0)
B - Billiards
問題タイプ:幾何 この反射の問題は、ゴールの点をx軸に対して対称な点とスタートの天を結んだときののときのの値を出せばいい。 具体的には、
- [:tex:{\displaystyle y = ax + b}]でなので、となる。
- は、スタートとaは対称な点の傾き。
- なので、適当に与えられた点のどちらかを代入する。
sx, sy, gx, gy = map(int, input().split()) a = (sy-(-gy)) / (sx-gx) b = sy - a * sx ans = -b / a print(ans)
C - Travel
問題タイプ:順列・全探索
内容的は、
* 単純に2番目以降のすべての順列を洗い出す(今回はitertools.permutationsを使った)。
* 最初は の一番初めのが選択されるようにする。
* そのパターン全てで目的のを計算をする。
* 最後は選ぶべきものの、1へ移動する時間を足す。
* とおなじになるカウントを計算するだけ。
* 解説のPythonコードは最後のところも含めて一般的に解いてたけど、そんなふうには書けないので、最後だけ確定的に別処理にした。
( _sum += t[pattern[n-1]][pattern[0]]
の部分)
別記事にする必要もないと思う。
import itertools n, k = map(int, input().split()) t = [list(map(int, input().split())) for _ in range(n)] # 2つ目以降の動きだけ順列作る num = list(range(1, n)) patterns = itertools.permutations(num) cnt = 0 for pattern in patterns: # patternの1つ目は必ず0番目を選ぶようにする pattern = [0]+list(pattern) _sum = 0 for i in range(n-1): _sum += t[pattern[i]][pattern[i+1]] # 順列の最後では1を必ず選択する。(index==0) _sum += t[pattern[n-1]][pattern[0]] # kと一致したらカウントしておく if _sum == k: cnt += 1 print(cnt)
D - Water Heater
問題タイプ:累積和
ちゃんと読んでないけど、累積和で解く問題。
itertools.accumulate
でエイ!だと思う。
そのうち別記事にしようと思う。
追記:
考え方書いた。全然itertools.accumulate
でエイ!じゃなかった。(まぁそれでもできるけど)
普通にすべての人のスタートとエンドで使う量をいい感じに記録して頭から足し合わせて制限きたら終わりっていうだけ。
おわりに
今回は、リアルタイムに参加してないんだけど、たぶんCまでだったと思う。
参考になる書籍
- 問題解決力を鍛える!アルゴリズムとデータ構造
けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも非常に結構読みやすい!!!(実際に、けんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているし、この書籍も非常に読みやすい)どのようなステータスの人にもおすすめの一冊になっている。
問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書)
- 作者:大槻 兼資
- 発売日: 2020/10/02
- メディア: 単行本
書籍は読み終わったので、Pythonで章末問題をこなしていっている。