こんにちは, Shinoryoです.
今回はPanasonic Programming Contest (AtCoder Beginner Contest 186)を, Pythonで解いてみた結果を書き連ねていこうと思います.
Panasonic Programming Contest (AtCoder Beginner Contest 186) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
A - Brick
$N$を$W$で割った商を出力すればよいです.
B - Blocks on Grid
2次元配列$A$の最小値を求め, 2次元配列$A$の各成分からその最小値を差し引いた残差を全て足し合わせればよいです.
下の例では, 多次元リストを1次元に平坦化するためにitertools.chain.from_iterable()を用いています. 単に2次元配列をmin()の引数にとるだけでは, list型の和になってしまいます.
C - Unlucky 7
Pythonには数値を8進数の文字列に変換できる関数oct()があるので, それをありがたく使わせていただこうと思います.
oct()を使わないのだとすれば, 定義に則って10進数を8進数に変換することになります. 関数化した方が楽だと思います.
D - Sum of difference
この結果は$A_1, \ldots , A_N$の順序に依存しないので, ソートして並べ替えてしまってよいです. $A_1 \leq \cdots \leq A_N$とすれば, $\left| A_i - A_j \right| = A_j - A_i$になります.
まずぱっと思いつくのは, 律儀に全パターン計算する方法です. しかし, この方法だと$O(N^2)$となり, TLE.
そこで, 若干工夫をします. 求めるのは
ですが, $A_1 \leq \cdots \leq A_N$とできることを利用すれば,
となります. $\sum_{j=i+1}^N A_j$はあらかじめ累積和を$O(N)$で求めておくことで対応できます. これを用いることで, (ソートでかかる時間計算量を考慮して)$O(N \log N)$でできます.
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - Panasonic Programming Contest (AtCoder Beginner Contest 186)」
Editorial - Panasonic Programming Contest (AtCoder Beginner Contest 186)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- nkmk様による「Pythonでflatten(多次元リストを一次元に平坦化)」
Pythonでflatten(多次元リストを一次元に平坦化) | note.nkmk.me
Pythonで多次元のリスト(リストのリスト, ネストしたリスト)を一次元に平坦化する方法について説明する. 2次元のリストを平坦化itertools.chain.from_iterable()sum()処理速度の差 itertools.chain.from_iterable() sum() 処理速度の差 3次元以上のリストや不規則なリストを平坦化 NumPy配列ndarrayの場合はflatten()また...
- nkmk様による「Pythonで2進数, 8進数, 16進数の数値・文字列を相互に変換」
Pythonで2進数, 8進数, 16進数の数値・文字列を相互に変換 | note.nkmk.me
Pythonでは通常の10進数だけでなく2進数, 8進数, 16進数として数値や文字列を扱うことができる. 相互に変換するのも簡単. ここでは, 以下の内容についてサンプルコードとともに説明する. 整数を2進数, 8進数, 16進数で記述 数値を2進数, 8進数, 16進数表記の文字列に変換組み込み関数bin(), oct(), hex()組み込み関数format...
- bluepost59様による「リストから和のリストを得る(累積和)」
リストから和のリストを得る(累積和) - Qiita
はじめに 数値計算をしていると, 積分のために総和を取ることはよくある. たとえば, 物理でメッシュごとの電場のデータからポテンシャルを求めるには, 総和を取ってメッシュ幅をかける. リストAがあるとして, 総和を取るだけならsum(A...
- nkmk様による「Pythonのrange関数の使い方」
Pythonのrange関数の使い方 | note.nkmk.me
Pythonで連番や等差数列を生成してfor文で使ったり, それらのリストを取得するには, range()を使う. 組み込み関数: range() — Python 3.7.2 ドキュメント ここでは以下の内容について説明する. Python2とPython3でのrange()の違いPython2のrange()とxrange()Python3のrange() Python2のrange()とxrange() Python3のrange()...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)