00:04
AtCoder Beginner Contest 143回目、A問題。カーテイン。
問題文。高橋くんの家の窓の横方向の長さはAであり、横方向の長さがBのカーテンが2枚取り付けられています。
カーテンは縦方向には窓を覆うのに、覆うのに十分な長さがあります。
窓のうち、カーテンで隠されていない部分の横方向の長さが最小になるようにカーテンを閉めます。
この時、窓のカーテンで隠されていない部分の合計の横方向の長さを求めてください。
入力は12と4で出力例が4。横幅12の窓の、例えば両端からの距離が4以内の部分が隠されます。
カーテンで隠されない部分の横方向の長さは4です。
ん?
入力例20、15だと出力は0。窓がカーテンで完全に隠される場合は0と出力してください。
入力例20、30の場合0。各カーテンが窓の横幅より長い場合があります。
高橋くんの家の窓の横方向の長さはAであり、横方向の長さがBのカーテンが2枚取り付けられています。
はいはい。
4、8。
あ、なるほどね。
だから、AとBをもらいます。
マップインとインプットドットスプリット。
で、Bは×イコール2です。
2枚あるので。
で、プリント、マックス、いや、ミンかな?
ミンかマックスか、マックスにしとくか。
MAX0か、A-Bでどうでしょう。
一旦出してみます。
あ、いけましたね。
MAX0とA-B×2にすることでマイナスにいかないようになってます。差分がね。
B問題いきます。
たこ焼きフェスティバル2019。
問題文。たこ焼きフェスティバル、たこフェスの季節がやってきました。
今年のたこフェスではN個のたこ焼きが振る舞われる予定です。
このうち、あいこめのたこ焼きの美味しさはDIです。
ところで、美味しさがXとYであるたこ焼きを一緒に食べると、体力がX×Y回復することが一般に知られています。
03:03
たこフェスで振る舞われるN個のたこ焼きから2個を選ぶ方法は、2分のN×N-1通り考えられます。
そのそれぞれについて、一緒に食べたときの体力の回復量を求め、その相和を出力してください。
入力例1。Nが3。3個のたこ焼き。3×1×2。体力が回復します。
相和は、1、2個目のたこ焼きを食べる。
2分のN×N-1通り。たこ焼きから2個を選ぶ。
まあ、二重ループでいいかな。
二重ループで良さそうですね。
Nイコールイントのインプット。Aイコールイストマップイントインプットドットスプリット。
4XインレンジNにしておいて、4YインレンジXプラス1N。
で、アンサーを定義しておきましょう。0でアンサーにして、アンサープラスイコールX×Y。
で、プリントアンサーでどうでしょうか。
和が出た。
さすがにコードテストを何もなしでやるのは無謀でしたね。
確認していきます。
ああ、もう全部間違ってるから根本的にミスってるな。
体力、一緒に食べた時の回復量、回復の相和、放出力、相和だから考え合ってると思ったんだけどな。
2、X×、あ、そうか。
そっかそっか、4分で単純に0からNコマで出かけてるからだ。
06:00
AのX番目、AのY番目ってやらないといけないですね。
ボンミスですね、これは。
11、はい、OKですね。
出力例2は312が出たらOK。
312。
はい、出ました。
提出していきます。
はい、ACしました。C問題いきます。
C問題、スマイルズ、ん?スライムズか。
問題文、N匹のスライムが横一列に並んでいます。
これらの色に関する情報が長さNのA小文字からなる文字列Sで与えられます。
左からI番目のスライムはSのI文字目に対応する色を持っています。
同じ色を持ち隣接するスライムは融合し、色は変わらずに1匹のスライムとなります。
この時、融合した後のスライムは、融合する前の各スライムが隣接していた他のスライムと隣接した状態になります。
最終的に存在するスライムは何匹となるでしょうか。
入力例1、10匹のスライムがいます。
A、A、B、B、B、B、A、A、C、A。
出力例は5。
最終的に残るスライムを文字列で表すと、A、B、A、C、Aとなります。
と書いてますね。
一旦4文でやってみようかな。10の5乗だからワンチャンいけそうな気がする。
Nイコールイントのインプット、Sイコールインプット、
アンサーイコールゼロ、
5、I、インレンジ、N、
いや、1からNにしとこう。
で、TMPイコール、Sの1文字目、S括弧0。
If TMPイコールイコール
SのI番目だったら、コンティニューかな。
そうじゃなかったら、だからTMPとSIが違ったら、
アンサープラスイコール1にして、
TMPイコールSのI番目。
09:00
で、プリント、アンサー、
コードテスト見てみましょう。入力例1は5が出たらOK。
4、惜しい。
うーんと、
そうだな、どうしようかな。
Sにプラスしようか。
EndイコールSの-1。
で、Sプラスイコールエンドにしといて、
ホワインレンジを1からNプラス1にしておいて、
だから一番最後の文字をプラスすることでいけたと思ったら、
うーんと、どうしようかな。
最後の文字を違う文字にするべきかどうかってことだな。
うーんと、
判定の仕方を変えるべきですね、これは。
ワイルブンにしようかな。
一回ワイルブンで考えてみようかな。
一緒か。
TMPが0番目、0文字目。
SのI番目の文字が一緒だったらスキップ。
違ったら足して、
いやー思いつかんな。
解説見ちゃお。
同じ文字が連続するSの極大な連続部分文字列をそれぞれグループとみのします。
この時、Sの各文字間の境界であって、
その両隣の文字が異なるものと前述したグループの境界は1対1に対応します。
以上より、前述したS内の境界に着目することで解を出力することができます。
12:06
うーん。
C++なので、他の解説もう1個あるので見てみます。
連続する同じ文字、同じ色を1つにまとめると何グループできるかという問題。
ランレングズ表現というのがある。
これは連続してどれだけの文字のまとまりがあるかというのが得られる。
自分はライブラリ化しているので貼るだけ。
ランレングズ表現のライブラリがない場合は尺取り法っぽくやるのがいいかもしれない。
ライブラリ化しているので貼るだけ。
さいですか。
他の方の提出例でPythonの方を見ておこうと思います。
ではまた次回お疲れ様です。