1. 競プロする人
  2. キーエンスプログラミングコン..
2023-11-02 33:43

キーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274)

キーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274)

https://atcoder.jp/contests/abc274


↓の提出コードを見ながらの聴取を推奨いたします
A:https://atcoder.jp/contests/abc274/submissions/46176040

B:https://atcoder.jp/contests/abc274/submissions/46176203


Atcoderホームページ:https://atcoder.jp/home

サマリー

キーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274)のA問題では、バッターの打率を指定された桁数の分だけ表示するプログラムを作る課題として出されています。B問題では、縦横のマス目に置かれている箱の数を求める問題となっています。コードを書きながらforループを使い、アメーバの観察記録から各アメーバがアメーバ1まで何個の親を遡るか求めます。制約が大きいため、実際にコードを実行して確認することが課題となります。キーエンスプログラミングコンテスト2022(AtCoder Beginner Contest 274)のレビューでは、参加者の解答と解説、解説コーナーでの解答が行われます。

00:03
キーエンスプログラミングコンテスト2022)AtCoder Beginner Contest 274)
A問題. ベッティングアベレージ
A問題。ベッティングアベレージ。問題文。
高橋くんは野球ゲームを作っています。高橋くんはバッターの打率を指定された桁数の分だけ表示するプログラムを作ることにしました。
整数ABがあります。ここでABは1以上10以下のA、0以上A以下のBを満たします。
この時、文字列Sを次のように定義します。
A分のBを小数点第4位で四捨五入した値を整数部1桁、ドット、小数部3桁の順に末尾0を省略せずに表記した文字列。
例えばAイコール7、Bイコール4の場合はA分のB、7分の4、0.571428で、これを小数点第4位で四捨五入した値は0.571です。
よってSは0.571になります。
ABが入力として与えられるのでSを出力してください。
これは文字列として1回受け取った方がいいかな。
AとBをマップのインとインプット、ドット、スプリットでABっていう変数を作っておいて、
B割るA。
ちょっと1回これでABプリントしてみましょうか。
0.571428、571428、5714って続くので、
4桁目、ドットの後の4桁目を四捨五入するから、まずこのABっていうのをSTR文にします。文字列にします。
ABイコールSTR、A分のB。
そして、if int ABの何個目だ?
0,1,2,3,4,5、5個目が5未満だったらプリント。
AB、かんま5、5以上だったらエルス。
どうしようかな。STR ABの定義のときに、そもそも5文字目以上を出さないようにしとくか。
STR A分のB、インデックスかんま6、if int ABのマイナス1、一番後ろが5以下だったらプリントABのインデックス4までを出すだけ。
じゃなかった場合、プリント float AB プラス 0.0001 かな?
0.571、入力例2は0.429が出たらOK。 0.4286、1個違った?
あ、そうか。 float ABの5までを出すようにしておいて、0.001か、0.001をプラスしたらいいな。
0.500、これ大丈夫か? 0.501、1が出ますか。プリント AB で0.5が出るでしょ。
インデックスが… インデックスがっていうか、そうか。ABマイナス1にしてるからか。
えーっと、if連ABが… プリント ABって何文字だ?
連ABが… 5文字以下だったら if連ABが6文字より少なかったら
プリント float AB、これどうなる?
プラス0.000って足してプリントされるのか、例の部分。 されないね。されないね。
文字列か。文字列足さないといけないのか。
えーっとじゃあ、プリント AB プラス文字列0をかける。
最大で0.000の可能性があるのか。 1,2,3,4,3…
最大で0を3つ足さないといけないから… 3マイナス連ABのマイナス2かな?
あー、ダメだね。ダメだね。 A問題でこんなつまずく?
もっと簡単な解き方あるな。
っていうか、Python、小数点、0。 0埋めができるはず、これ、Pythonって。
0埋め、0埋め。 0埋めはどこだ?
フォーマット。 0を埋める。これだ。
数値の上位に0をつけて全体を定められた長さにすることを0埋めとします。
違うのよ。逆なんだよな。 小数点以下0表示しない。
桁数指定0埋め。 小数点0を表示する。
小数点以下の桁数を指定する方法。
フォーマット。 NUM。 010。
先頭に3文字分の矢箔。 違うんだよな。
小数点以下の桁数を指定して出力。 あったあったあったあった。
小数点8桁までで123.456を123.4560000のように0埋めして表示したい場合には、
これ何て言ったらいいの?
辞書型で使う尖った吹き出し括弧。
で、カンマ、ドット、08F。
だから、えっと、よっ。
プリント04か?
えーっと、AB。
プリント04FドットフォーマットAB。
ABでもこれ、STRだから、フロート型にした方がいいのか?
フロートAB。 0.5000。OKOK。
あー、1個多いね。1個多いね。 0.003。
で、入力例4が1010の1.000。OK。
入力例5が0.000。
とりあえず入力例はクリアしましたので提出します。
さて、ACしたのでB問題いきます。長かったな。
B問題. ラインセンサー
B問題。ラインセンサー問題文。
縦H横Wマスのグリッドがあります。
上からI行目、左からJ列目のマスをIJと表します。
各マスの状態は文字C、IとJの部分の文字Cで表されます。
CのIJがドットならばIJには何も置かれておらず、
シャープならば箱が1個置かれています。
1以上W以下を満たす整数Jに対して
整数XJを次のように定義します。
J列目に置かれている箱の個数、言い換えると
CのIJがシャープであるような整数Iの個数、
Xをすべて求めてください。
ちょっと何を言っているかわからないが、とりあえず
入力例3,4、出力例1,2,0,3。
横で見るんじゃなくて縦で見てシャープの数、
何本ですかっていうのを答えてくださいですね。
OKです。
これってでも、これってでも、あれじゃない?
点数行列したら一発じゃない?と思うんだけどな。
もう一回ちょっとやってみましょうか。
HWイコールマップイントインクットドットスプリットで
C、Lにしとこう、リストなので。
リスト、どうやるんだっけ?
マップ?これで行けたっけ?
イントインクットドットスプリットを
for in range H。
これでH回分の入力を全部Lに入れられているはずなんだが、
テストケースの入力例を入れへのコードテストで確認。
あ、そうか。マップじゃねえや。
ドットかシャープだから、
普通にインプットドットスプリットでいいですね。
はい、入ってます。が、入ってますが、
スプリットされてないので、
普通にインプットかこれ?リストインプットか?
リストですね。スプリットいらなかったです。
あ、そうか。これをやっぱCにしといて、
新しいのをリストLにしといて空の文字列にしておきましょう。
文字列じゃない、リスト。
for H in range Hのtmp、
テンポラリーなリスト、空のリストを作っておいて、
もう1回for文。
tmp.append小文字CのH番目のやつを入れる。
で、l.append tmpってすれば、
点字行列されてるはずなんだよな、これで。
だから横にひっくり返したような形になるはず。
なんで…あれ?
なんか1個足りないね。
あ、HとW逆なんだ。逆っていうか…
HW、縦H横W、縦H横W、1,2,3…
コードの実装と挙動の確認
あれ?なんで3行しか入ってないんだ?
printC、largeCは4行…違う、4列3行。
そうか、こっちW回やらないといけないのか。
for w in range Wか。
あれ?あ、はい。
for CのW番目ですね、H番目じゃなくて。
はいはいはい、OK。
あとはもう、4文で、for commodiel in radielで
print commodiel.countsharp、どうじゃ?
1,2,0,3でしょ?
ですね。これ縦になってるけどいいのかな。
入力例3見てみましょうか。
2,7,4が出たらOK。
2,7,4、OK。
入力例4。
051,2,2,0,0ってめっちゃ長いですが。
051,2,2,2、OKね。
これちょっとあれだな。
どうしようかな。
Lにtmp.countsharpの数をもう直に入れといて、
で、printコメ印、コメ印なのかなこれ、
アスタリスクか、アスタリスクLにしたらいいんじゃない?
良さそうですね。
じゃあ1回ちょっと出してみましょうか。
通ってくれ、8、OK、AC。
C問題行きます。
C問題、アメーバ問題文。
あなたはアメーバの観察記録を付けました。
最初1匹のアメーバがおり、番号は1です。
観察記録は時系列順にn個あり、
I番目の観察記録は番号をAIのアメーバが分裂して消滅し、
新たに2匹のアメーバが生まれ、それらにそれぞれ2i、2iプラス1と番号を付けたというものです。
この時、アメーバ2i、2iプラス1の親と呼びます。
各Kイコール1から2nプラス1について、
アメーバKから何台親を遡るとアメーバ1になるか求めて下さい。
2nプラス1行を出力せよ。
K行目にはアメーバKから何台親を遡るとアメーバ1になるかを出力せよ。
入力例1はnが2、aは1と2。
出力例は01122。
アメーバ1からアメーバ23が生まれ、アメーバ2からアメーバ45が生まれました。
アメーバ1は0台遡るとアメーバ1になります。
アメーバ2は1台遡るとアメーバ1になります。
アメーバ3は1台遡るとアメーバ1になります。
アメーバ4は1台遡るとアメーバ2になり、2台遡るとアメーバ1になります。
アメーバ5は1台遡るとアメーバ2になり、2台遡るとアメーバ1になります。
言っていることは理解できたが、
しかもこれ純不動なんですね。
入力例2だとNが4の1352ってなってて 出力例が011223322って2に戻ってるんで困ったねー
1回ちょっとやってみて
Nイコール
イント
インプット
ちょっとムズそうだったら
解説チラ見して
収録外で問題理解しようと思います
aイコールリストのマップの
イント
インプットドットスプリ
一応入力で1をもう入れておこうか
プリント
aで
12が出るはず
出たね
出た
どうしようかね
アメーバの観察記録の解析
×Lでいいか
もう大文字ラジエルで
観察記録は時系列順にN個
番号AIのアメーバが分裂
一番最初はゼロなんだよねだから
だから
えーっと
えーなんて言ったらいいかな
0番目が分裂したら
2、3
が次に入るんだよね
で2からは4、5が
3からは6、7が生まれる
でしょ
4、5
6、7
倍々になるのか
えー倍々になるのか
アメーバ1から2、3が生まれ
だから2、3は1台遡るとアメーバ1になる
4、5、6、7は2台遡るとアメーバ1に戻る
8、9、10、11
12、13、14、15が3台遡ると
かな
あれでも入力例2
1、3、5、2
え、ちょっと待ってどういう問題だった
番号AIのアメーバが分裂して消滅し
新たに2匹のアメーバが生まれ
あ、はいはいはいはい
えーだから
分裂した大元のアメーバを記録してるんだ
ややこしい全部書いといてくれよ
だから
番号5番目が分裂したから
えーと
8、9
が生まれたのかな
違う10、11か
ん?2倍かこれ
2倍とプラス1か
2倍とプラス1だな
2倍とプラス1が生まれてるので
で、制約は?
2×10の5乗
2×10の5乗
2×10の5乗回
できる?これ
10、100、1000
1番10万
20万回
いけるか?ギリいけるか?
無理か?
1回やってみるか
for i in range
max a
までやりましょう
max a プラス1かな
えーとで
tmpイコールからのリスト
あーと
まずは
tmp.append i と
i×2-1
違うわ
i×2と
i×2プラス1
l の i 番目に
.append
tmp
ってやったら
printl ちょっと確認しましょうか
error
list append take exactly one argument to given
はー、append に入れられるのは1個だけですよか
じゃあ一応2行に分けとくか
そうね、分けとくか
tmp.
いやーこれ tl いいそうですね
×2 プラス1
あれ?
リストインデックス
out of range
あーと
あーとそうですか
if
l
i より小っちゃかったら
l.append
tmp
else
l の i 番目っていう感じにしようか
ちょっとリストにアクセスしすぎな
めっちゃ怒られる
リストインデックスは out of range
なんで
なんでさ
ほんとじゃあ
l 2
からのリストを
in range
何個にしようかな
10の
テストケースが?
テストケースっていうか制約が?
10の5乗かける2?
じゃあ10の7乗とかにしておきましょうか
あーこれは重すぎそうだな
012345が入ってる
012345
あーこれ結局どうやって出力したらいいかが
定義できないな
うーん
ok じゃあちょっと宿題として解説見て
キーエンスプログラミングコンテスト2022のレビュー
勉強しておきます
今日はここまでにしておきましょう
ではまた次回お疲れ様です
33:43

コメント

スクロール