とあるプログラムを組んでみましたが…
一応自力で(最終的に正解まで行けるプログラム)はくめました。
ただ、量が多いとあまりにも時間がかかってしまいます。
つまり、これはアルゴリズム的に間違っていると思いますが、どこをどう見直したらいいのかがわかりません…
コードは以下の通りです。
ruby
1deal=gets.chomp 2readys=[] 3count=0 4while n=gets.to_s.chomp! 5 if n==""||n.nil?||n=="nil" 6 break 7 else 8 readys.push(n) 9 count+=1 10 end 11end 12sets=readys.map{|x| x.to_i} 13#p count 14#p sets 15 16all_combi=[] 17sets.count.times{|i| all_combi+=sets.combination(i+1).to_a} 18#p all_combi 19nums=all_combi.length 20last_count=0 21for i in 0..nums-1 do 22 conbis=all_combi[i] 23 24 if conbis.one? 25 last_count+=1 if conbis[0]>deal.to_i 26 else 27 last_count+=1 if conbis.inject{|sum,i| sum+i}>deal.to_i 28 end 29end 30 31puts last_count
アルゴリズム的に良いコードを書くにはどうしたらいいのでしょうか?
また、アルゴリズムに関しては経験を積むよりも、基礎知識をしっかり押さえるほうが先決でしょうか?
Ruby的にえってコードが、沢山あるので、何がしたいか、解読するのが大変です。出来れば何のアルゴリズムかも書いて下さい。
入力で、一行目にホストとなる数字が与えられます。二行目以降にそれぞれ数が与えられます。あらかじめ何行とは書かれていません。 二行目以降に与えられた数字で、一行目の数字を超える組み合わせはいくつあるのかを出力するプログラムです。
今回の場合は、一行目に取得した数字をそのまま変数にセットし、二つ目以降の数字をループで回して、入力がなくならない限りは数字を配列にセットしています。取得した状態ではstringですので、intergerに変換し、all_combiで、多くの配列を一つの配列にまとめた次元配列にしています。その後配列の中身が一つだけならそのまま、二つ以上あるなら合計数を求め、それぞれホストの番号を上回っていたらカウントをしています。
すみません今出先なので、全ての組み合わせをやる必要はありません。こえない数を数えて全体2^nから引くというのは如何でしょう
最初に 文字列にしてというのもナンセンスです
最初の取得時に数字のまま可能でしょうか?あるいはchompの後にto_iをつける感じでしょうか?
帰りました、ところで、数字は重複があるのでしょうか?これでだいぶ変わります。
一応ありを想定していますが、だいぶ変わるのであれば参考に2パターン見てみたいです。
むむぬ、重複無しなら、数行にまとめられると思ったのですが...。重複ありだとまあ普通にやるしかないですね。suzukis様の回答でいいと思います
回答2件
あなたの回答
tips
プレビュー