AtCoder Beginner Contest 187をPythonで解く

投稿日: 

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回はAtCoder Beginner Contest 187を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - Large Digits

数字をint型に変換せず文字列で取得します. 文字列はリストのように○番目の文字を取り出すことができるので, それを利用して各桁の数字の合計を計算します. その後, 大小判定を行います.

B - Gentle Pairs

2つの点の組み合わせの全パターンを出し, それぞれに関して傾きが$-1$以上$1$以下であるかを計算します. 傾きの計算の際には$x$座標の差の絶対値と$y$座標の差の絶対値を比べるようにすれば, 整数の範囲内での計算で済みます.

C - 1-SAT

不満な文字列であるための必要条件として, その文字列は$S_1, S_2, \ldots , S_N$のどれかであるということが挙げられます. よって, $S_1, S_2, \ldots , S_N$に対して, それらの先頭に!を付けたものが$S_1, S_2, \ldots , S_N$に存在するかを確認します.

$S_1, S_2, \ldots , S_N$にある文字列が存在するのを確認する「item in seq」の演算にかかる時間計算量は, list型が$O(N)$でset型が$O(1)$です. したがって, set型で扱った方が実行時間が短くて済みます. 実際, list型で行うとTLEです.

D - Choose Me

$X$として$X = (\text{高橋氏の得票数} - \text{青木氏の得票数})$を考え, これが正になるかどうかを判定にします.

「高橋氏がある町で演説を行わなかった場合, その町の青木派は全員青木氏に投票し, 高橋派は投票に行きません」ので, $X$の初期値は$-1 \times (\text{全青木派有権者数})$です. そして, 「高橋氏がある町で演説を行った場合, その町の高橋派も青木派も全員高橋氏に投票します」ので, $i$番目の町で演説をした場合, $X$は$2A_i + B_i$だけ増加します.

したがって, $2A_i + B_i$の大きい順にソートして, 順番に加えていけばよいです. ソートに時間計算量が$O(N \log N)$だけかかります.

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels

Blog Archives