AtCoder Beginner Contest 134 の復習

プログラミング

どーも、masukenです。

先日、はじめてAtCoderの競技プログラミングに参加したので、
それの復習をしたいと思います。

また、僕は初心者であるため、復習する時のポイントとしては、
標準入力の確認、他の解法の確認を重点的にしたいと思います。

スポンサーリンク

A Dodecagon

ABC 134 A- Dodecagon より

正12角形の面積を求める問題です。半径aの円に内接する場合面積が3a^2になることは知らなかった。
けど、紙に図形書いて計算すれば求めることができるでしょう。

標準入力は数字一つのみなので、適当な変数を置いて、それをinputします。
この時、読み込むのは整数なのでintの形で読み込まなければいけません。

その変数を正12角形の面積の公式に当てはめて、その面積を出力すれば正解です。
上では、一度面積を変数areaの中に入れていますが、時間が惜しければ
printの中にそのまま面積の公式を入れてもいいと思います。

B Goalden Apple

ABC 134 B- Golden Apple より

りんごの木を監視するのに、何人の監視員が必要かという問題です。

この問題のポイントは監視員が何本の木を監視できるのか、ということと、
木の本数と監視できる木の本数の商が割り切れたとき、割り切れなかった時で場合分けすることだと思います。

標準入力が数字2つ与えられている場合は、map関数とsplitを使います。

map関数は次のように動作します。

map(関数, 数値) → 数値を関数に入れて出力する。

つまり、input関数に入力された数値が関数(今の場合はint型に変換する)に入れられて、
変数N、Dに代入されるということです。

その後は、監視員の監視できる木の本数を求めて、if文で場合分けして計算します。

※後で他の人の回答を見てみると、場合分けをしなくても答えを出力できるようです。
整数A、Bに対して、A/Bの切り上げは(A+B-1)/Bの商と等しいという性質を用いれば、
場合分けをしなくても計算することが可能です。

C Exception Handling

ABC 134 C- Exception Handling より

数列の最大値を出力する問題です。i行目の出力は数列中のAiを除いた要素のうちの最大値を出力します。

この問題を実際に解いてみると、必要な数は数列中の最大値の2番目に大きい数だけだとわかります。
(Aiが最大値以外の時は、数列中の最大値を出力、Aiが最大値の時は、2番目に大きい数を出力)

標準入力は、数列の要素数を示すNと空のリストAを用意します。
Nはこれまで通りですが、複数行の数をリストに代入したい場合は、
先に空のリストを用意して、for文を用いて一行づつ数値を空のリストに入力していきます。
コンテスト中は、ここでint型に変換するのを忘れていて失敗してしまいました。(2敗)

その後は、数列Aを降順に並べて0番目の要素(最大値)と1番目の要素(2番目に大きい値)を後で取り出します。
最大値のindexを取ってるけどこれは必要だったのかな??
後のfor文でA[i]が最大値の時に2番目に大きい値を出力するでいい気がします。

D Preparing Boxes

ABC 134 D- Preparing Boxes より

この問題は、コンテスト中は文章を一回読んでもあまり意味がわかりませんでした。
日本語力が必要ですね。でも文章も少し分かりにくい。

要するに、入力では箱の数と任意の整数iの倍数が書かれた箱に入っているボールの総数%2の数が
与えられていて、出力で、ボールを入れる個数とどこにボールを入れるのかを出力します。

コンテストではこの問題は解けず、また考えても解法が思い浮かばなかったため解説を読んだところ、
後ろの番号の箱にボールを入れるかどうか、から考えていけば良いそうです。
僕はこの回答を参考にしました。

入力は箱の数nと、iの倍数に入っているボールの偶奇を判定したリストです。
リストの入力はリストの中で map関数を用いています。

また、このコードではsum(a[i : : i]) % 2という部分がありますが、これは
iの倍数が書かれた箱に入っているボールの総数を求めて、偶奇を計算しています。
a[i : : i]という部分では、リストのi番目からiステップごとに値を取り出しています。
リストの処理の方法をしっかりと復習しなければいけません。

総評

今回はABC134のA-Dまでの復習を行いました。

ABC126から問題数が4→6問に増加したのですが、
現在のA,B問題が従来のA問題、C問題がB問題、D問題がC問題くらいに当たるのですかね??

当分は、従来のC問題レベルまでを解けるようにしたいと思います。
また、AtCoderでの標準入力になれれば、問題を解くスピードはもっと向上すると思います。
そのため、あと2、3回分の解説は標準入力についても言及したいと思います。

他の人のコードも見ていますが、中にはあまり理解できないコードを書いている人がいるのですが、
それは自分の知識不足なのか、ただただその人のコードが理解しにくいのか、どちらなんでしょうか?

とにかく、pythonの基本的な文法もインプットしなければいけないと感じました。
今回のD問題のリストの取り扱い方も、基本の文法ができていなかったため思いつかなかったのだと思います。

それでは、また。

コメント

タイトルとURLをコピーしました