例えば入力が
2 3 4 5 1 6 7 8 9
であれば1 2 3 4 5 6 7 8 9
にすればよくて、そのためにはまず先頭から5
まで(4つ)の数値を逆にして5 4 3 2 1 6 7 8 9
にする。続いて先頭から1
まで(5つ)の数値を逆にすれば1 2 3 4 5 6 7 8 9
となって完了。で、出力すべきはどこまでを逆順にするか、という数値なので、4 5
が正解となる。なお、出力はスペース区切りでも改行で区切ってもよい。説明が長くなったので、早速。
I=map(int,raw_input().split()) m=max(I) while m: i=I.index(m)+1 I[:i]=reversed(I[:i]) I[:m]=reversed(I[:m]) print i print m m-=1がむしゃらなコードではあるが、設問にもあるように効率は求められていないのでよしとする。考え方は、先頭から最大値までを反転して最大値を先頭に移動。その後先頭から最大値(までの個数)分を再度反転。で、最大値が終端に来るので、あとは最大値を減らしながら繰り返す。 で、134byte。pythonのトップは76byte。へぇ。
I=map(int,raw_input().split()) m=max(I) def F(a):I[:a]=reversed(I[:a]);print a while m:F(I.index(m)+1);F(m);m-=1とりあえず縮めるも、112byte。あっさり行き詰まる。
I=map(int,raw_input().split()) m=max(I) def F(a):I[:a]=I[a-1::-1];print a while m:F(I.index(m)+1);F(m);m-=1なんとか小細工。これで107byte。
あ、1から連続した数値なのだから、リストの長さがそのまま最大値になるのか。
I=raw_input().split() m=len(I) def F(a):I[:a]=I[a-1::-1];print a while m:F(I.index(str(m))+1);F(m);m-=1これで103byte。ギブアップか。