AIZU ONLINE JUDGE Volume0 - 0033

アルゴリズムの練習として
AIZU ONLINE JUDGE Volume0 - 0033 Ball
JavaScriptとHTMLでやってみた



AIZU ONLINE JUDGE Volume0 - 0033 - jsdo.it - share JavaScript, HTML5 and CSS

Input部分にはサンプルデータがあらかじめ入っていますが
問題の形式に沿って入力して実行すると
サンプルデータ以外でもきちんと実行されます(自分で試した限りでは)


早速解説という名の言い訳ですよ


一番苦労したところは 入力フォームからのデータ取得!w
改行で区切ったり スペースで区切ったりして なんとか配列にしました
今回一番時間がかかった個所


本題のアルゴリズムの方

1から10の番号がつけられた10個の玉がある順番で筒Aに入っています
それを番号が小さな玉の上に大きな玉がくるように筒B、筒Cに振り分けていきます
ただし並べ替えることは出来ません
10個すべてを筒Bか筒Cにいれることができるでしょうか?

というようなもの
詳しくは問題を見てください


これを解くためにこんな風に考えました。

次の玉を入れられるかどうかは 各筒の一番上の玉の番号と比べればわかります。
なので 筒B、筒Cそれぞれの一番上の玉の番号だけ記憶しておきます。

なるべく効率よく玉を入れるために 筒Bと筒Cのどちらにも入れられるときは
より番号が大きな方の筒に入れることにします。

たとえば
 筒B:8
 筒C:1
という状態のとき
 10番の玉が次に来るとします
この時筒Cにいれてしまったら1番の玉がもったいない(?)です。
まだ2番の玉が残っていたりしたら、もう入れられなくなってしまいます。

番号が小さな玉の方が使い勝手が良いのでなるべく残しておきます。

いちいち両方の筒と比較するのは面倒なので、簡単にするために筒Bの方を優先にすることにします。
そうすると筒Bの方が常に番号が大きなが入っていることになり、比較が簡単になります(多分)


実際こんな感じで、まず筒Bと比べる。

 筒Bの一番上の玉の番号 < 次の玉の番号

であれば次の玉は筒Bに入れることができます。
新しい玉を筒Bに入れれば、それが一番上の玉になります。

そうでなかった場合は筒Bには入れることができないので、筒Cとも比べてみます。

 筒Cの一番上の玉の番号 < 次の玉の番号
 
であれば次の玉は筒Cに入れることができます。
新しい玉を筒Cに入れれば、それが一番上の玉になります。

これでもダメならどちらの筒にも入れることができません。
ということは結果はNO
玉が途中で入れられなくなったら10個目まで調べなくてもこの時点で終了です。

どちらかの筒に入れることができたらそのまま次の玉、次の玉…と比較し、最後まで入れられたら結果はYESです。

あとはこれをデータセットの数だけ繰り返します。



あと処理にかかった時間をミリ秒で表示しようと思ってやってみましたがちゃんと表示できているのかわかりません…


はい!長々と書きましたが、これが今自分が思いつく限り一番効率的なやり方です。

「なに面倒なことしてるんだ」「こうすればもっと効率的」「ここの書き方間違ってる」
などなどツッコミ大歓迎です!