Comment detail
自然数の分割(別表現) (Nested Flatten)This comment is reply for 4532 nido: Ruby非再帰版です。 PenM 1....(自然数の分割(別表現)). Go to thread root.
ご指摘ありがとうございます。
検証が甘かったです・・。
修正版はPenM 1.7GHz(Win XP)で16.1秒でした。
検証が甘かったです・・。
修正版はPenM 1.7GHz(Win XP)で16.1秒でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | def move(a)
min=a[-1]
max=nil
mv_from=nil
a.each_with_index do |e,i| # 移動可能な最小値の位置を探す
break if e<(min+2)
mv_from=i
max=e
end
return false unless mv_from
mv_sum=1
mv_to=nil
one_pos=a.size
a.each_with_index do |e,i| # 移動先を探す
if e <= (max-2)
mv_to ||=i
if e==1
one_pos=i
mv_sum+=(a.size-i)
break
end
mv_sum+=e
end
end
a[mv_from]-=1
if mv_to >= one_pos
a[mv_to]+=1
else
mv_to.upto(a.size-1) do |i| # 移動先以降を詰め直し
if mv_sum==a.size-i # ここ以降は1だけ
a.fill(1,i...one_pos) if i<one_pos
break
end
a[i]=[a[i-1],mv_sum-(a.size-i-1)].min
mv_sum-=a[i]
end
end
true
end
def print(a)
puts a.map{|i| "o"*i}.join("\n")
puts "--"
end
def young(n)
1.upto(n) do |m|
a=Array.new(m,1)
a[0]+=n-m
print a
while move a
print a
end
end
end
start_time=Time.now
young 50
puts Time.now-start_time
|



kozima
#4536()
Rating2/2=1.00