自由帳

なにか書く

ABC134 (ABCE4完)

AtCoder Beginner Contest 134をやりました。

Eが解けた!しゅごい。いうて今回のEは簡単だったんじゃないんでしょうか。私が解けてるので。逆にFはべらぼーに難しそうな香りがしました。

今回でレートは茶色に乗りました。もっと精進せねば。まず緑。

 

 

A - Dodecagon (AC, 21:01)

そうなんだ…(面積の話)(数学雑魚)

 

B - Golden Apple (AC, 21:04)

つまり監視員1人は視程×2(左右範囲)と+1(正面の1本)の範囲が監視できると。

なので木の総数をその値で割って、小数点以下は切り上げればいいでしょう。

(解説を見たところ、A/Bの切り上げを求める式があるんですね。こういう細かいところをもっと学んだ方がよさそうですね…)

 

C - Exception Handling (AC, 21:12)

問題を読んだ時点で考えることは、「最大値と次に大きい値しか使わないな」と。

さらに同じ値でも場所が違えば別物として扱う(入力例2から)と。

ということで

  1. 入力を受け付けるときに最大値と次に大きい値を記録する。この次に大きい値は、最大値に等しい場合もある
  2. ループして最大値を出力していく。ただし対象の値が最大値と等しい値の時は、次に大きい値を出力する

こういう形に落ち着きました。

 

E - Sequence Decomposing (AC, 22:09, 4WA) (めちゃくちゃ嘘っぽい)

解けたとは言うものの、正直悔いは残る。

実は21:37時点でロジックは組みあがっていたものの、単純な条件分岐のミスで上手くいっていないことに気づいていなかった。
サンプル例が少ないからと自分で入力例を考えることでこれに気づいたが、時すでにお寿司であった。

これがさっさと終わっていれば、Dも解けただろうに。

 

 

色塗をすると書いてありますが、結局のところ複数の昇順の数列に分解するということですね。問題タイトルにもDecomposingと書いてあります。

そういうわけなので、先頭から効率よく数字を詰めこんでいきつつ…なんだか貪欲チックな風に書いたら通りました。めちゃくちゃ嘘っぽいし、あとで実行時間順で提出一覧みたらめっちゃそんな感じだった。クソ笑えますね。笑えませんけど

 

 

D - Preparing Boxes (WA)

問題文の意味を理解するのに滅茶苦茶時間がかかった。

ある箱について、書かれている番号の倍数の書かれた箱も含めた、ボールの合計数の偶奇を指定する。そのような入れ方は存在するか

という話ですね。まずここにたどり着くのに時間がかかりました。

次に考察を進めます。どう考えても、例えば2番の箱について、4,6,8...と何個入っていようが、2番の箱に入れるボールの数だけで偶奇は制御できるのでは?と。

ここでなぜかうん?????となって止まりました。何故。

つまり番号が大きい方から進めていけば、倍数の偶奇を確認して、今の番号は入れるか入れないか決めればいいだけという話ですよね。ここにたどり着いたのはEを通した後のコンテスト終了10分前の話です。当然間に合いませんでした。

 

 

結果こそよかった方ですが、悔いはたくさん残ります。

そういう意味では、とても有意義で楽しい時間だったと思います。やっぱりプログラミングは楽しいですね。

今回の反省点は

・考え方の正誤もそうだけど目の前のプログラムの出来にも気を払う

・サンプルデータが少ないなら自分で作ろう。考え方の検証も出来ていいぞ

・問題文の読解能力が低すぎる。

このあたりでどうでしょうか。

ABC133 (ABC3完)

AtCoder Beginner Contest 133をやりました(先々週)

 

結果がとても悪くてしょんぼりして書いてなかったけど、自戒のためにも書かなければと思いました

 

A - T or T (AC, 21:02)

タクシーはN人全体でB円なんですね、気づいてなくてちょっと時間がかかりました。

 

 

B - Good Distance (AC, 21:31)

文字数やばくないですか?実は逃げました。

飛ばしてC行って、2WAした(!)ので戻ってきて、改めて読んだら書いてある通りでした。なんてバカなことを…

 

 

C - Remainder Minimization 2019 (AC, 21:49, 4WA)

4WAって何?

・問題の性質上、余りが小さくなる数字同士をかければ小さくなるのでは?余りが小さいやつ2つをかけよう!

→そもそもそれはそうなの?数学が出来ないので証明は分かりませんが、とりあえず通ってないので絶対に違います。

 

・よく考えたら高々2019個見ればよくないですか?

→これはそうですね。でもまだまだ足りない。

 

・2019の素因数分解すればよくないですか?

→論点はそこじゃなかった。

 

・高々2019個なんだから総当たりでいいのでは…

→これが正しい考え方でした。ここでやっとAC。

今まで何やってたんだろう。

 

 

D - Rain Flows into Dams (WA)

愚直に書いてTLEを吐いて終わりました。

解説を見たところ、全体から1個を求める形で式にできたようですね。

このように式として整理する形で答えを求めていく問題、この次の週のAGCのAでも出ていたので、今後必要な考え方だなあと思いました。

 

 

というわけで今回は

・数が絞れてれば総当たりも可能では?

・全体から1個を求められないか?

・式という形に落とし込めないか?

このあたりの3点で。

某Dashボタンでお呼び出っしゅボタン

なんで?

  • 自室は2階で、食事の時に壁ドンで呼び出していた
  • ヘッドホンで音楽聞いてたりすると分からないよね…
  • 随分昔にもらったDashボタンが残ってたので、1階に設置します

 

 

始めるために必要だったこと

  • サーバー機

まあ逆に言えばこれくらいなんだけど。ボタンはあるし。

ちょうどいいので、まだ自宅には1台もいらっしゃらないRaspberry Piを買いました。4が発表されたところだけど。

 

 

やること

qiita.com

基本的にはこの記事のようにIFTTTの設定をした。

ただし、記事で使われていたDasherはGithub見ると

⚠️ Dasher is sunsetted ⚠️

とか書いてあった。sunsetted

というわけで、Dasherのところでgreat alternativeとか書いてあった

 

github.com

これを使うことにした。

 

すごく親切なので一点を除いて引っかかることはなく、その一点だけをご紹介してこの記事は終わり。

単純に、パッケージが足りてなくて動かなかった。

github.com

こいつが効いた。あとはamazon-dashのreadme通りに進めればよく、とても簡単だった。

ABC132(A, B, C)

AtCoder Beginner Contest 132をやりました

ABC通ってDがダメ。600点ですが、Cが結構早く解けたので半分よりは上の順位になりました。

今回からちゃんとVSCodeの設定をいじいじして臨みました。

 

 

開幕

下痢が出ました。3分くらい出遅れています。

 

 

A - Fifty-Fifty (AC, +7min)

なんかこう、かえって困惑してしまって意味不明なものを最初書いてました。

1文字目をとりあえず覚えて、違う文字が来たらそれも記憶してそれぞれをカウントしました。カウントが2-2なら条件を満たしてますね。

 

 

B - Ordinary Number (AC, +3min)

3分(もかかっているが)で解いたので何をしたかいまいち覚えてないんですが、何も考えないでx[-1] <= x[1] < x[+1]とその逆を書いてカウントしちゃえばよくないですか?と思いながら解いていたと思います。

 

 

C - Divide the Problems (AC, +5.5min)

なんかすっと理解してしまったが故に、自信の問題でちょっと問題文が何言ってるか分からなかったです。

これはソートして中央の2値を大-小すればいい話ではないのか?と思って出したら通りました。

 

 

D - Blue and Red Balls (じかんぎれ)

出たよ組み合わせ問題。中学高校と勉強しないとこういう問題で詰まります。

とりあえずあの手この手でサンプルからどういう計算式をするのか考えたり、実際にどういうパターンが考えられるかを想定するなどしていましたが、途中でEやFを覗いたりなどもしました。

Eはとりあえず3歩で行けるところを使ってグラフ再構築すれば解けるのでは?と思いましたが、その瞬間にDの解答がピンときました。残り5分で。

当然間に合いませんでした。ちなみに解答も間違っていました。つらい。

 

 

今回の反省点は算数の勉強をしましょうということです。もちろんnCrは存じ上げておりますが、それを適用する問題の経験がありませんでした。

 

ABC131(A, B, D)

AtCoder Beginner Contest 131をやりました。

結果はABDが通ってCがダメ。700点ですね。

言語はC#

 

 

A-Security (AC, 4min)

よくわからなかったので、入力をToCharArray()しちゃました。

for文をLength-1まで回してi+1とiが同じならそこでBad出力してReturn。

問題文が一瞬?となって4分。

 

B-Bite Eating (AC, 14min)

とどのつまり、味の絶対値が一番低い物を食ってしまえば良いということになると思いました。for文を回して、味の絶対値が低い物の味の値を記録して合計から引いて出力。

途中まで味の値も配列かなんかで来ると思ってたのもあって書きなおして10分、合計14分。

 

D-Megalomania (AC, 50min)

実は途中までCやってたんだけど、さっと書いたコードが入力例ですら通らなくてキツいとなったのでD問題に逃走しました。なのでDで何分かかったかは分かりません。

どう考えても納期が近い奴から順にやっていけばいい話でした。何を思ったのか、ICompareble<T>を持ったクラスを作ってListに投入してSortぽちっとで済ませました。

完了時点で50分、Eを覗いた感じやばそうだったので、Cに戻りました。

 

C-Anti-Division (WA)

根本的に考え方が間違ってたシリーズ。

範囲内に含まれる割り切れる数は端っこからいきなり割り切れるとかの事例を除き(範囲/n)のはずで、足すと最小公倍数が2重カウントされるからそれ引けば行けそうだなーとか思ってました。全然ダメでしたね。というかこの考え方自体、解説サイトで見た枝狩りチックな思考法でよくありませんでした。

解説を覗き見したんですが、なるほどMax以下の塊からMin以下を引けばいいんですね。範囲を外側にとってしまうという発想はありませんでした。次からは頑張りましょう。

ベン図、ベン図。なるほど。

 

 

というわけで今回は

・困ったらクラスを書いてしまう思想の是非

・範囲を外に広げて(0まで広げる的な)考えやすくする

・ベン図とかそいういう考え方

あたりでしょうか。