とりあえずは茶色にしたが・・・

とりあえず,かなりの回数参加して,あまり努力せずにAtCoderを茶色にしてみたが・・・

とりあえず自分の勉強用としては,相当にマッチしているサイトで良かったと思う。ただ,その前提って高校数学が少しだけわかり,大学数学はほんの少しみたことあって,経済学にかすかに触れて最適化の感覚になんとなくなじんでいるから,という特殊背景があったような気がしないでもない。

茶色までは楽できると期待は外れたとこがある。例えば,緑まではc++いらないって書かれていたことを信じてたのが裏切られたとか(ACしているのを見ると可能だが,私には面倒で無理な話だったということ。)。仕方がないと,少しだけc++も使うことが何回かあった。このために公式提供のサイトで少しだけc++を勉強した(これは良かった・さくっとできたので),というかコンテスト中に公式提供のc++の書き方を見ながら書いたことが何度もあった(というか今も)。

あと,世間のforとifがわかってほんの少しだらだら勉強してたら茶色になれるも信じてた。だったらノー勉で茶色までいけるならだらだらとやるかと始めた。ただ,それが当てはまる人と当てはまらない人がいそうだというのが最近の実感。以下,それについてだらだらと書いてみる。

パフォーマンス400のライン

ここ3回のパフォーマンス400の境界をざっと目視で確認すると。

  • 158 : Cまで, 約60分
  • 157 : Bまで, 約20分
  • 156 : Cまで, 約30分

となる。普通にやったらCまでは解かないと茶色にはなれないと言えそう。

ここ3回の400のラインで求められていると思われるもの

158

8%消費税と10%消費税の額が与えられて,元の額の最小値を求める問題。

少なくとも制約を見て,支払う金額のループで解けるということを思いつく必要がある。それか切り捨ての不等式を真面目に考えられる算数的能力。

157

3x3のビンゴの判定を20分以内に解く or 条件を満たす最小の整数(C問題)を解く。

Cは制約考えると1から順番に考えていって解けるらしいが・・・私は,桁数で場合分けして解いて,ちょっと痛いミスをして解けなかったが。。。

156

C は,x_iの列が与えられたときの(x_i -m)2の和を最小にする問題。

mはx_iの最小と最大の間にあるということに気付いて実装する(20分以内に!)か,確率・統計(最小二乗法の感覚)の常識で,mが実数ならmの値は平均値なので,その前後の整数を試せば良いことに気付くか,さらに2次関数の知識で整数に近い方が解答になることに気付くか。制約読んで,総当たりでも行けると気付く解法もある。c++以外で間に合うかはわからないが。

D は,教科書レベルの組み合わせ + 指数・2項係数の高速化(D問題)が必要な問題。

プログラミングのお勉強で茶色に行けるのか?

私がずっと思ってることとして,出題者・参加者双方,中受算数か大学受験数学をくぐっているか,高校数学ぐらい苦労せずに身に着けられる頭脳を持っている人のような気がしてならない。

156のCは,たぶん本当の進学校とかだと数1の段階で授業で触れられてる話だと思う。しかし,高校生の自分が,知識として(x_i-a)2の和を最小にするようなaは平均値,という知識を知らずにこの問題を解けるかと言われると怪しい。そういえば,過去には|x_i-a|の和を最小にするのはaが中央値のとき,という知識も必要な問題もあった記憶がある。

最小を取るaは両端の間にある,なら求められる知識はいらないといわれると思う。しかし,それも式の形を見て最小にあたりをつけるというある種の高校数学的感覚がないとでてこない発想だと思う。常識で思いつくと言えばそれまでだが,その常識がある人もそれなりの知能がある人だと思う。

そもそも偏差二乗和の和を求める式は,x_iを定数とみてmを変数と見て1変数関数ととらえる感覚の有無が解答のしやすさに大きく効いてくると思われる。しかし,それを高校数学で偏差値50切る人がわかってる感覚とは思えない。少なくとも自分には,知識とか訓練なしであの式を1変数関数とは見れない。

157のBのビンゴは確かにforとifの典型題だと思う。これを20分ならまあまあお勉強と言える。しかし,そういう早解きでなくCの2項係数で考えると,これは競プロ自体のお勉強が必要になる。

158は算数だと思う。ただ,元の支払額のループで考えて良い,ということは何回か過去問を解いてるとわかってくる感覚かな・・・

以上3つは,(私は文系だが)理系の世界に住んでいれば,こんなのわからない人いるの?と言われる話で,算数や数学と呼ぶことすらはばかられる話だと思う。しかし,文系の一般の人にこれプログラミングの練習してれば茶色になれますよ,とは言えるというかと言えない。

算数・数学を通した得たふわっとした感覚が求められている

算数・数学を勉強すればなんとかなる,とも言えない。こういう数学が典型で頻出,というわけでなく,いろいろなところを断片的につまんでばらばらに出題している感じだから。こういうのは,知識の増強で対処できるものではなく,受験数学のような教科書の類題の単純あてはめっぽくない訓練をした経験が求められている感じである。それも,できるだけ誘導少ない問題で。あるいは,それを訓練せずともできる地頭があるか。

また,最適化のような考え方になじんでいるかも影響しそうだと感じている。自分はほんのわずかだけ経済学に触れたことがあるので,その経験からするとこれ常識よね,と思えることは何回かあった。しかし,それが高校以前にわかったとか,本で勉強して身に着けたか?と言われると疑問である。最適化の数式によるかっちりとした理解,というよりも言葉でふわっと最適化を考える感覚を使ってる感がある。自分は,この感覚を経済学部に存在しているだけで,勉強なしで自然と身につけた自覚がある。しかし,文系の一般人にお勉強で身に着けろ,と言われると?となる。

茶色は文系の一般人が「お勉強」でなれるものだと思っていたが,茶色でもそれが無理なんだというのが今の自分の実感。

勉強として使うには

レートとか気にせずA,Bを入門の問題集として解いていくのは算数微妙な人も含めて強くおすすめできる。Pythonとかでやれば良いと思う(自分はPythonでなく別のスクリプト言語使ってるけど)。本当のプログラミング初心者がA,Bをc++で解くことにこだわるのは,あまり意味がないと思う。

ただ,Cは数学っぽい問題とそれ以外の問題が混ざっているので,仕分けしながら解いていかないといけないかなといった感じ。

文系で数学が少しだけ得意とか,少しでも理系っぽい人は,特殊な勉強をしなくてもCぐらいまでは良い練習問題として使えるような気がする。だから,茶色ぐらいになるようにすれば?は正しそうな気がする。

世間のプログラミング入門で絵をかいたり何かを作ったりというのがおすすめされるが,それは万人に向いているようで向いてないと思っている。絵とかゲームに興味のない人には自分で作りたいものが考えられないので,自分で考えて何かを解いた経験がいつまでたってもできない。それと同じで,このサイトは数学やパズルのようなものになじんでいない人には自分で考えることができない学習サイトである。しかしそれらになじんでいる人には適したサイトなのだからそれで良いよね,と思う。