反転問題
次のような問題があります。
[問題]
N頭の牛が1列に並んでいて、それぞれの牛は前か後ろのいずれかを向いています。 農夫は全ての牛を前向きにするために、牛を回転する機械を買うことにしました。 この機会は購入時に 数K を設定する必要があり、1回の操作で K頭の連続する 牛 の向きを反転させることができます。 全ての牛を前向きにするために必要な最小の 操作回数M と、それを達成する 最小のK を求めてください。
解法・ソースコード
まず、一番左端の牛に注目します。この牛を含む区間は1つしかありません。
したがって、この牛が前を向いているならば、その区間は反転させる必要がありません。
逆に、この牛が後ろを向いているならば、その区間は反転させる必要があります。
そして、これ以降はこの1番左の区間は考える必要がなくなります。
これを繰り返し行うことによって、必要な最小の反転回数を求めることができます。
また、計算量 を落とすためにリストfを定義し、区間を反転させた場合は1そうでない場合は0を設定し、その合計値が奇数である場合は最初の向きとは逆に、そうでなければ最初の向きのままとなっていることを確認しています。
[Google Colaboratory]
1 | #---------- 入力例 ---------- |
[実行結果]
1 頭回転させる機械の場合 5 回操作で牛を全部前向きにできる。 2 頭回転させる機械の場合 牛の向きを全部前向きにするとはできない。 3 頭回転させる機械の場合 3 回操作で牛を全部前向きにできる。 4 頭回転させる機械の場合 牛の向きを全部前向きにするとはできない。 5 頭回転させる機械の場合 牛の向きを全部前向きにするとはできない。 6 頭回転させる機械の場合 牛の向きを全部前向きにするとはできない。 7 頭回転させる機械の場合 牛の向きを全部前向きにするとはできない。 解:回転させる最小の連続頭数=3 最小の操作回数=3
牛を連続で 3頭回す機械<.b> を購入すれば、最小3回の操作</ > で牛を全部前向きにできることが分かりました。