#---------- 入力例 ---------- cows = 'BBFBFBB'# F:前向き、B:後ろ向き #---------------------------- n = len(cows) # 牛の頭数 k = 1# 求める最小の牛を回転させる連続頭数(初期化) m = n # 求める最小の操作回数(初期化)
# 牛を回転させる連続頭数kを固定した時の最小操作回数を求める # 解が存在しない場合は -1 を返す defcalc(k): # 区間[i, i + k - 1 ]を回転させたかどうか f = [0for _ inrange(n)] res = 0# 操作回数 total = 0# リストfの和 for i inrange(n - k + 1): if (dir[i] + total) % 2 != 0: # 先頭の牛が後ろを向いている場合 # 回転操作を行う res += 1 f[i] = 1 total += f[i] if i - k + 1 >= 0: total -= f[i - k + 1] # 残りの牛が前を向いているかどうかチェック for i inrange(n - k + 1, n): if (dir[i] + total) % 2 != 0: return -1 if i - k + 1 >= 0: total -= f[i - k + 1] return res
# 牛の方向を0(F:前向き),1(B:後ろ向き)に変換 dir = [0if x == 'F'else1for x inlist(cows)]
for i inrange(1, n + 1): # 牛の頭数分ループする print(i, '頭回転させる機械の場合') x = calc(i) if x >= 0and m > x: # 牛を全部前向きにでき、かつ操作回数がより少ない場合 print(x, '回操作で牛を全部前向きにできる。') m = x # 最小の操作回数を更新 k = i # 回転させる最小の連続頭数を更新 else: print('牛の向きを全部前向きにするとはできない。') print()