1. 競プロする人
  2. M-SOLUTIONS プロコンオープン..
2024-06-07 17:41

M-SOLUTIONS プロコンオープン2021(AtCoder Beginner Contest 232)

M-SOLUTIONS プロコンオープン2021(AtCoder Beginner Contest 232)

https://atcoder.jp/contests/abc232


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


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

2・5・11・17・23・31日更新予定

#競技プログラミング #Python #podcast
00:04
M-SOLUTIONS プロコンオープン2021、AtCoder Beginner Contest 232、A問題、救急ソルバー問題文、3文字からなる文字列Sが与えられます。
Sは、1以上9以下の整数ABと文字XをAXBのように順につなげて得られます。
AとBの積を求めてください。
S、入力例1、3X7、出力例は3×7なので21が出ます。
入力例2は9X9√81、1X1は1ということですね。
これって分けられるかな?
AXBイコール、リスト、マップ、あ、でもイントができないのか。
インプット、ちょっと試してみましょうか。コードテスト。
で、9X9、プリントAXB、はい。
リストにしてインプットを分けたら、それぞれ定義した変数に入れられたっぽいので、もうそのままやるだけですね。
プリント、イント、A、アスタリスク、イント、Bです。
提出していきます。
1行で書けそうな気もしますがね、これぐらいなら。
はい、B問題に行きます。B問題。
か、かえさーチーパー。
問題文。
高橋くんはA小文字からなる文字列Sを持っています。
高橋くんは文字列Sに対して書きの操作をちょうど1回行います。
まず皮膚整数Kを選ぶ。
その後、Sの書く文字をK個後ろのA小文字に変更する。
ただし、Aの1個後ろのA小文字はBであり、Bの1個後ろのA小文字はCであり…
Zの1個後ろのA小文字はAです。ループするんですね。
例えば、Bの4個後ろのA小文字はF、Yは3個後ろはB。
文字列Tが与えられます。高橋くんが書きの操作によってSをTに一致させることができるかを判定してください。
03:03
SをTに一致させることができるか。
皮膚整数K。Sの書く文字をK個後ろのA小文字に変更する。はいはいはいはい。
えー、高橋くんがSをTに一致させることができる場合はイエスと出力し、できない場合はノーと出力せよ。
1、1個目の入力例はABCでIJKが与えられます。
ABCとIJKは一緒にできますか?ですね。出力例はイエス。
高橋くんがKイコール8を選ぶと、Aは8個後ろのIに、Bは8個後ろのJに、Cは8個後ろのKに。
それぞれ変更され、SとTが一致します。はい。
まあ、そうですね。全部の文字をK個分動かすことができるって書いてるので、
1周26回分1個ずつずらして判定したらいいんじゃないかなと直感的には思うんですが、いかがでしょうか。
Sイコールインプット、Tイコールインプットで、どうしようかな。
フォーアインレンジ1から27。
いや、一応ちょっと多めに50とかにしとこう。
で、Tイコール、待って、Tの文字列は何本や。
Tは、長さは等しい。10の5乗。いけるでしょう、たぶん。
Tをリスト化して、リストTにして、で、TMPイコールからの文字列。
からの文字列、リスト、どっちがいいんだろうな。
からの文字列でやってみますか、1回。
フォー小文字TインラージT、で、TMPプラスイコール、
06:07
アルファベットの云々はどう読むんだっけ。
アルファベット、パイソン、AからZまでのアルファベットを出力する。
ストリングじゃなくて、これかな。CHR97から123。
どうすればいいんだっけな。97から123。
だから、これに90、今やってるやつに97足したらいいんだな。
97足すiの%26でループが行われるはず。
CHR97プラスi%26をTMPに1個ずつ足していって、
if tmp==sだったらexitプリントyes。
それがなくフォー文が終わったらプリントno。
1回コードテストを見てみましょうか。
入力例1はyes、no、no。
tmpをちょっとプリントしてみてみましょう。
なんか四角文字になっちゃってるな。
ってことは判定されていないので。
どうしたらいいのこれ。
97足すiACHR。
そうか。まずTを数字化しないといけないんだ。
だから97じゃなくて、文字を数字にするのはどうするんだ。
09:02
ORDに小文字のTを入れて、そこに4分のiを足して26で割ったものを
また文字に変える。あれダメだな。
ちょっとこのCHRの方をプリントで確認してみますね。
いかんせんこのアルファベット関連のやつがどうにも身につかんですね。
そうか。4TinTにしちゃってる。
1回4分の1番最後にTイコールTMPにしておかないといけない。
50回ループ。50回もいらないな。
30回ループ。空の文字列。大文字のTを4分に入れる。
TMPプラスイコールCHRのORDT。
ORDTで何が出るかを確認。
105,106,107。
そうか。別にTMPにする必要ないな。
ORDのTプラスiは1個ずつ増えている。
これをパーセント26。
12:06
アルファベットって26個だよね。
abcdefghijklmnopqrstuvwxyz26。
パーセント26しちゃうと小さくなっちゃうので、これにプラスするんだ。
プラス97だ。
これでいけるはず。
97が必要だったんですね。
入力例2はノー。
違う。ノーじゃない。イエス。
入力例3はノー。
入力例4はイエス。
提出していきます。
結構時間かかっちゃったな。
なんか重いぞ。
重いぞ。
これRTLEした。
ダメなんだ。
理論は合ってるんでしょうか。
シンプルに長さ10の5乗の場合、
10の5乗の4分30、レンジ30での4ループはオーバーしちゃうんですね。
なるほど。
どうしようかな。
B問題で二重ループで解けないってあるんだな。
というかそうか。
Sの各文字の差とTの各文字の差が一緒だったらOKなんだ。
違ったらノーなんだ。
というのはわかりましたが。
つまり数字に置き換えたいな。
15:07
数字に置き換えたとて。
ちょっとパッと思いつかないな。
解説見ますか。
多分考えは合ってると思うんですけどね。
K大なりイコール26の時、K後のA小文字はK-26後のA小文字と等しいので、
高橋くんが選ぶKは0小なりイコールK小なりイコール25を満たすとして良いです。
よって高橋くんがKイコール0から25を選んだ場合の26通りそれぞれについて、
高橋くんが操作を行った後のSがTと一致するかを調べ、
26通りのうち一致するものが一つでもあればイエス、そうでなければノーを出力。
あるKに対して高橋くんが操作を行った後のSがTと一致するかを調べるには、
高橋くんが行う操作を実際にシミュレーションすれば良いです。
すなわち実際に入力で与えられたSの全ての文字をK後のA小文字に置き換えてみて、
それがTと一致しているかを判定すれば良いです。
Sの過去各文字を操作するには、プログラミング言語の標準的な機能である繰り返しの機能を用いると良いでしょう。
文字をK後のA小文字に置き換えるには、
A小文字AからZのアスキーコードがそれぞれ連番になっていることを用いると良いでしょう。
あれ?4文2個作ってんな。
ん?何でだ?何がいけなかったんだろう?
4文2個で解けてるっぽいので、どこかがちょっと無駄に使ってるんでしょうね、これは。
いやー、ちょっと他の方の提出例を見ておきますね。
はい、ではまた次回。お疲れ様です。
17:41

コメント

スクロール