#問題
AtCoder ABC72 D問題より
#方針
① lst[i + 1] = i を満たしてしまっているような i (0 <= i <= N - 1) を探索し、lst[i] += 1 とする。
② 0が出現する区間に用はなく、1が出現する区間を、その区間の長さとともに data に格納する。
③ 区間の長さが1の時は、1回隣の要素とswapを行えば良いので、1を。区間の長さが2以上の時は、一番左の最小の要素を一番右まで持ってくる回数であるlen(list(v)) - 1を求める([..., 3,4,5, ...]となっているなら、[3,4,5]→[4,3,5]→[4,5,3](3 - 1 = 2回)のように)。
④ 以上を全ての1で出来た区間で行い、要したswapの回数を答えとして出力する。
#ソースコード
Python
1from itertools import groupby 2 3N = int(input()) 4p = list(map(int, input().split())) 5 6lst = [0] * N 7for i in range(N): 8 if i + 1 == p[i]: 9 lst[i] += 1 10 11data = [] 12for k, v in groupby(lst): 13 data.append([k, len(list(v))]) 14 15data = [el for el in data if el[0] == 1] 16 17cnt = 0 18for el in data: 19 if el[1] == 1: 20 cnt += 1 21 elif el[1] > 1: 22 cnt += el[1] - 1 23 24print(cnt)
#質問
サンプル入力や、手元で行った実験では全てうまくいったのですが、コードを提出するとごく一部のテストケースでバツを食らいます。古いコンテスト故にそのテストケースが公開されておらず、自分でも上の考え方のどこがどう間違っているのかが見えずにいます。いささか雑な形の質問となり恐縮ですが、お力添え頂ける箇所がございましたら、ご指摘のほどよろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/27 07:25 編集
2021/05/27 08:05
2021/05/27 08:07