poj 解けない問題
2007/09/29
解けない問題を記録しておきます。
2819 数学の知識か...
2506 -- Tiling
うーん、こういう問題をさくっと解くためにはどういうアプローチでいけばいいんだろう。
ヒントになるかな
フィボナッチ数 - Wikipedia
代数的組合せ論
ドミノタイリング
とかかかな。
解答が思いつかなかったので、いつものごとくdiscussをチラ見して、
A[1]=1,A[2]=3,A[n]=A[n-1]+2*A[n-2]
jar cvf ../my.jar .
jarsigner -keystore keystore -storepass password
-keypass password my.jar "My Alias"
ab-a-b
互いに素な2つの自然数aとbがあるとき、ab-a-bより大きなすべての自然数は0以上の整数xとyを使ってax+byの形に表せる。また、ab-a-bはこの形に表せない。チャレンジ!整数の問題100
evaluateを使うと文字列を実行できる。
入力してもらった値を直接使うとかできる。
1032 -- Parliament
何となく再帰っぽいプログラムをしていたら、1000でやはり処理が帰ってこなくなって自力で解くのをあきらめた。
参考
1032 Parliament
規則をみつけてコードにしたほうがよいようだ。
1811 -- Prime Test
素数を扱う問題だったので、なんとなくできるかなと思ったのが運のツキで、かなりてこずりました。
まず、だいいちに自分に数学の知識がないことが原因だと思いましたが、javaで解く場合には、大きな数の素数を判定する方法はjavaのほうで用意されているおり、あとは、最小の約数(素数の)を求めるところがキモのようです。
この問題を解くための基本のアイデアはあったのに、時間超過で泣かされて、もう少しもう少しとやり続けてかなりの時間の睡眠時間を削りました。
参考
Cozy Ozy - ハマッタ(;´д`)
にあるように
(1)
素数判定
(2)
小さい素数で割り続けて判定
という流れは変わらずです。
(2)でいかに効率的にするかがキモだと思います。
で、実は、素数の判定が遅いからだめだと信じきって(javaの実装はだめだと信じきって)いろいろ素数判定のためのコードをみつけてきてはためしたのですが、もちろんはやければはやいほどいいのですが、(2)を劇的にはやくすることはできませんでした。
(2)をどういうふうに効率よくおこなうかといいますと、素数で割ればいいのですから、素数テーブルをもたせればよい、というのもありますが、簡単なのは、奇数のみで、割ること、つぎに奇数でなおかつ素数である可能性が高そうな値で割ること、に専念すればよしです。
12章 素因数分解アルゴリズムをみたら、あーなるほどでした。
30n+1、30n+7、30n+11、30n+13、30n+17、30n+19、30n+23、30n+29
12章 素因数分解アルゴリズム
pojの1811で、すごく時間を費やしました。
http://acm.pku.edu.cn/JudgeOnline/status?problem_id=1811&user_id=nakawaka&result=&language=
昨日の夜中、あきらめて寝る直前に、
12章 素因数分解アルゴリズム
というページをみて、基本的なアイデアを思い浮かべてねた。
で、会社のお昼休みに
アイデアをコードにして、半ばあきらめもーどでサブミットしたら通った。
うれしい。
H氏に指摘されて、はじめきがつかなかったけど、やはり危険だなと思いました。
SpreadMap
引数の配列の数が奇数の場合、java.lang.ArrayIndexOutOfBoundsException
が容易に発生します。
そもそも、どういった目的のクラスなのかわかってないのですが。。。
Groovy - Running
groovy.lang.GroovyShell
にファイルをわたせればよいのですね。
前半部分は、groovyにあったコードを拝借。
へっぽこだけど記録のために公開。
メソッド名とうがとても適当。
はじめ、富豪的にコードかいて(TreeSetとか使って)、なんとなくだめだろうなぁと思いつつ、案の定だめで、
メモリーが足りないがでて、つぎに、時間がたりないがでて、最後に答えがまちがっているがでて、へこんで、
ソートの順序に工夫が必要なことに気がついて、ソートどうしようかなぁと悩んで、解答例をちら見して、見たことに後悔しつつ、Comparatorを使う方向でコードを書いてようやくsubmitされた。
しかし、意味不明な感じのコードになったなぁ。
小数点以下に値があるか調べるまたひとつの方法
H氏のコードをベースにしてメソッド化
jxpathです。
ルートのタグにxmlnsがある場合の、使用方法
不正確です。
ネームスペースが指定されている場合の注意点。
1007 -- DNA Sorting
バブルソート
ソートのカウントはバブルソートで。
このサブミットでようやく37個終了。
簡単なもの(自分で解けるか、解答例があるもの)しか解いてないので、だめだめなんだけど。
| Filthy Rich Clients: Developing Animated & Graphical Effects for Desktop Java Applications (The Java Series) Chet Haase Romain Guy Prentice Hall Ptr 2007-08-03 by G-Tools |
ユークリッドの互除法 - Wikipedia
wikipediaに載っていたアルゴリズムをコードにしてみました。
ユークリッドの互除法
1917 -- Automatic Poetry
簡単そうだったのでチャレンジ。
なんとなくできたので、submitするとruntime errorばかし。
理由がわからず、仕方がないので、たまたまみつけた、コードをsubmitするとacceptされた。
MyWiki.jp - PKU Wiki - 1917 Automatic Poetry
自分のコードがよくないのはわかった。
で、いろいろサブミットして実験した結果、どうも正規表現のエスケープ文字で使っていた¥がいけないらしかった。
環境はmac osxでeclipse
作成手順はeclipseでコード書いて、それをコピーしてブラウザで貼付けていたのだけど、eclipseでの入力時にoption+¥で\にしないとだめなようだ。
うーん、かなりへこんだ。
下記サイトの区分が参考になりそう。
易しい問題でコード量が少ない問題にチャレンジしようと思う。
MyWiki.jp - PKU Wiki - 分野別重要問題集
Superlong sums
Cozy Ozy - Superlong sums(0)
Super_long_sums
はじめ、読み取った数字をStringBuilderにアペンドして最後にそれをBigIntegerにして計算させていました。
自分で実行させてみて計算できたので、submitしたのですが、やはりだめ。
問題文には、「1<=N<=1000000」とあるので、実験してみて、たしかに「1<=N<=1000000」な文字列からBigIntegerに直すにはそれなりのコストがかかっているようだったので、はじめのアイデアはボツ。
思いつかなかったので、shortcoderな方のサイトをみていて、char[]の配列を使っていたので、なんとなくその方向性でいくことにした。
変なところで、はまったのは問題文には、「the length of their sum does not exceed N」とあったことに気がつかず、足したら桁が増えるということを気にしてコードを書いていたこと。
最後に、Time Limit Exceededがでるようになった。で、悩んだあげく、Scannerを使っていたのをやめて、StreamTokenizerを使用したら、ようやくacceptedされた。
無駄な部分が多々ありますが、とりあえずコード。
コードは三つのパートに分かれてます。
1。入力読み取り
2。計算
3。出力のためにStringBuilderにつめてます。
Cozy Ozy - Sum of Factorials(1)
1775 -- Sum of Factorials
階乗の計算
| Programming Collective Intelligence: Building Smart Web 2.0 Applications Toby Segaran Oreilly & Associates Inc 2007-08 by G-Tools |
pojでacceptされるためにはやいほうがよいようなので、ちょっと計測してみました。
マシンは、macbookでeclipse上での実行です。
calc:[2813]ms
BigInteger ver:[7337]ms
calc:[2790]ms
BigInteger ver:[7210]ms
same result?:true
わかりづらいですが、
calcのほうが自分で実装したもの、BigIntegerがisProbablePrimeメソッドを利用したものです。
数が大きい場合、
BigIntegerのisProbablePrimeを使用する場合、引数のcertaintyを少なくすると早くなるけど、精度が悪くなります。
コードは以下
2262 -- Goldbach's Conjecture
ゴールドバッハの予想 - Wikipedia
解き方がすぐにおもいつかなかったので、discussをチラ見して、すぐにコードを書いて、submitしたのですが、時間切れでacceptされず。
何度もためしてもだめ。
それで、C++のコードをみつけてコピーして試したら、あっさり、acceptされたので、悩みました。
isPrimeというメソッドを作成して素数判定していたのですが、やはりそれが遅かったです。
はじめの実装は、
この BigInteger が素数である可能性が高い場合は true を返し、必ず合成数である場合は false を返します。certainty が 0 以下である場合、true を返します。
パラメータ:
certainty - 呼び出し側が許容しない確率の尺度。この BigInteger が素数である確率が (1 - 1/2certainty) を超える場合は true を返す。実行時間はこのパラメータの値に比例する
戻り値:
この BigInteger が素数である可能性が高い場合は true、必ず合成数である場合は false
現在、Acceptedが多い問題で悩まずできそうな問題にチャレンジ中。
1656 -- Counting Black
こんな問題だと計算量とか考慮に入れないですむので、自分的には楽なのだけど。
poj 1844です。
1844 -- Sum
はじめは、自力で解こうとして、やってました。
それで、なんとなく解答できるコードをつくったのですが、うう、やはり、10000とか100000とかで、答えが返ってこないOrz...
うーん、やはりこれはアルゴリズム!?を勉強しないといけないですね。
こういった問題苦手です。
1146 -- ID Codes
この問題の解法が知りたい。。。
ネットでpascalでかかれたコードを読み解きながら、なんとかjavaにしてみて、ようやくサブミットできた。
書き散らしたコードだけど公開しておきます。
やはりデータベース周りなんでしょうかね。
まあわたしは傍観者ですから、斜め視線でみているわけですよ、うーん、お世辞でもかっこいいとは思えないわけです。
クローズもれが潜在的におこりうるコードなんて、言語道断の極みですよ(と強い口調でいってみる)。
いや、わたしも人のことは言えないですよ。ですが、自分のコードを棚にあげて、ライブラリやフレームワーク、他の開発者のコードを疑うなんて。。。まあ、まっさきに疑いますけど(笑)。
確かに、ネットで調べるとドライバの問題だとか、使用している言語のライブラリにバグがとか、そういう情報はすぐにみつかりますが、自分のコードを疑うことをしないと。
で、今後、自分がデータベース周りを担当するようであれば、
(A)はじめから大規模なデータを見越して考えよう。
(B)インデックスを作ればよいわけではなくて、データに見合ったインデックスの作り方があるはずだ。
(C)100万レコードなんてあたりまえ、大量データで試験できるようにしよう。
(D)大量テストデータを自動生成できるツールをつくろう。
(E)コードに計測用のコードを入れておく、もしくはあとからでも、きちんとはかれるようにしておく。
(F)ログのだしかたを工夫しておく。
反省ですが、計測することを軽んじてはいけませんね。
で、問題がおきてからそれに対処するという方法は確かにおちいりやすい仕事のすすめかたですね。
それが楽になるんですよね。仕事した気になりますが、そもそも問題が起きるようなものを作ってしまったことにたいして考えをおよぼさないと。
反省します。
最短かつ最速にアクセスする「DB高速化技術」(後編):ITpro
pojの1146にチャレンジしていて、手で入力するのが面倒になったので、標準出力、標準入力を他のストリームにつなげて、自動化を試みた。
テスト結果を判定するまでにはいたってない
Orz...
select 1 from dual
このDUAL表を使用したSELECT文は、Oracle Databaseの他にMySQLでもサポートしていますが、PostgreSQLはサポートしていません。このため、Oracle用に開発されたアプリケーションをPostgreSQL用に修正する時は注意が必要です。[ThinkIT] 第2回:拡張部分によって違いがでてくるSQL文 (1/3)
while文 - Wikipedia
repeat-until文( Pascal)とdo-while文( C)
結構、ちょっと古いコンピュータの本(アカデミックよりな)にpascalとかでコードが載ってたりするので、メモ。
while 条件 do 文
repeat 文; 文...; 文 until 条件
HHa(H派)メモ - ほぼりスクリプト言語Scalaの情報ソース
Scalaという言語があるらしい。
Groovyよりはやそうだ。
※groovyにはやさを求めてはいないけど。
coding, by Derek Young: Scala vs. Groovy: static typing is key to performance
Scala言語というのは何やらエレガントらしい。
ちょいとためしてみよう。頭がすっきりする言語ならいいなぁ。
sumim’s smalltalking-tos - Smalltalk は死につつある…とかってバカじゃね?
やばい、そろそろSmalltalkの勉強スタートしないと!!
現在、Smalltalkを勉強したい(まだスタートしていません。)気持ちがちょっとづつ上昇中。
Erik Hechtさんが作成された、非公式なVE eclipseプラグインがChooseBeanに対応したようです。
windows版で試したら検索して選択できました。
Erik Hechtさんのサイト
www.ehecht.com
VEの動向は気になりますね。
関連
プログラマメモ2: java 非公式なVE eclipseプラグインが更新されていました。- 08/02 Choose Beanが使えない。
インターネットで調べればすぐにでてくると思いますが、とりあえず。
最小公倍数 - Wikipedia
を参考にしてみます。
えーと、
gcdは最大公約数 GCD (Greatest Common Divisor)というものらしいです。
API標準のBigIntegerに、gcdというメソッドがありますね。
これを利用して、
最小公倍数は、LCM (Least Common Multiple)を求めてみます。
ユーティリティメソッドにしてみました。
今後何かの役にたつかもしれないのでメモ
おおざっぱにですが。
まず最初にアプリケーションサーバを疑った。
そして、maxThreadsとかの値を変更した。
で、つぎに、データベースのコネクションプールを疑った。
使用しているのは、Overview - Commons DBCP
で、調べるとBasicDataSource (Commons DBCP 1.3-SNAPSHOT API)のmaxActiveの初期値が小さいという判断で、大きくした。
そして、maxWaitが-1(無限)だったので、10000にした。
そうするとクライアントが固まってみえることはなくなった。データベース接続エラーがでるようになったけど。
ほんのちょっとだけ、状況は解決したように見えたけど、だめだった。
で、コードのある部分のロジックのミス(if文の判定が逆)から一度だけ動作を期待している箇所が、何度も動いていることがわかった。
※でも、これログがでているはずだから開発中に気がついてもよかったのかもしれない。
で、その何度も動作している箇所のコードがマルチスレッド環境で、運が悪ければ、connectionを閉じない可能性があった。コネクションの使い回しの仕組みが危うかった。
※実験してたしかに閉じてないないだろうケースがでた。
で、どの点においても、曖昧な知識で試行錯誤しているのが残念無念。
org.apache.commons.dbcp.BasicDataSource
The maximum number of active connections that can be allocated from this pool at the same time, or non-positive for no limit.
The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or -1 to wait indefinitely.
ちなみに、POJで改行ではまって少しロスしたので、このメモを残します。
1.5から導入されたprintfでの注意。
System.out.printfで改行コードを含める際に注意すること。
注意するのが面倒ならいっそ、System.out.printlnつかったほうがよいかも。
windowsとosxあとブラウザがからんだ状態で、ソースコードをいったりきたりさせていると、自分の書いた\nが正しいかどうかがだんだん疑わしくなる。。。
あと、
100問を解くのを目指す人がいたりしますね。pojで検索したらみつけました。
replore的日記 - [poj] とりあえず100問解く事を目指すか
僕は、shortcoder本の影響ではじめました。
プログラマメモ2: groovy メソッドポインタ - printlnとうつのが面倒なときに
以前の記事ではメソッドポインタとかいってたけど、どういう呼び方がいいのかなぁ。
Grな日々(uehajの日記) - Groovyの奇妙な演算子(その1)
aliasing
このブログだとmethod aliasingとか言い方しているぽいし。
逆ポーランド記法の勉強のために作成。