投稿

ラベル(topcoder)が付いた投稿を表示しています

TopCoder - SRM 425 DIV 2: 500

SRM 425 DIV 1: 250と同一問題。これ難しかった。とりあえずやっつけでやってみた。コードは こちら 。312点…。問題は、東西南北自由に動き回るロボットが指定回数動いたときに、同じ地点に戻ってこない確率を求めるというもの。 public class CrazyBot { double we, ww, ws, wn; double total = 0.0; public double getProbability( int n, int east, int west, int south, int north) { int sum = east + west + south + north; we = east * 1.0 / sum; ww = west * 1.0 / sum; ws = south * 1.0 / sum; wn = north * 1.0 / sum; boolean flag[][] = new boolean[n*2+1][n*2+1]; move(flag, n, n, 1.0, n); return total; } public void move( boolean flag[][], int x, int y, double p, int n) { if (flag[x][y]) { return; } if (n < 0) { return; } if (n == 0) { total += p; return; } flag[x][y] = true; if (we > 0.0) { move(flag, x+1, y, p * we, n-1); } if (ww > 0.0) { move(flag, x-1, y, p * ww, n-1); } if (ws > 0.0) { move(flag, x, y-1, p * ws, n-1); } if...

TopCoder - SRM 425 DIV 2: 250

今回は、数値配列の中で、その数値配列内の数値を含まない最小公約数を求める問題。コードは いつものとこ 。皆さんのコードを見てたら、たいていの方が、ただ単にmax * minでだしてた・・・。それで良いのかwww? import java.util.Arrays; public class InverseFactoring { public int getTheNumber(int[] factors) { Arrays.sort(factors); int lcm = factors[0]; for (int i=1; i<factors.length; i++) { lcm = getLcm(lcm, factors[i]); } if (lcm == factors[factors.length - 1]) { return lcm * 2; } else { return lcm; } } int getGcd (int x, int y) { int z=x%y; if(z==0) { return y; } else { return getGcd(y, z); } } int getLcm (int x, int y) { return x/getGcd(x,y)*y; } }

TopCoder - SRM 144 DIV 2: 500

うんむ・・・。難題にぶち当たって先に進まないから、息抜き(?)にTopCoderを解いた。なぜかストレス発散になるwww今回の問題は与えられた数値が何個の数値で割り切れるのかを求めるもの。割り切れない場合は'-1'を返す。 public class ProductOfDigits { public int smallestNumber(int N) { int i; for (i=1; true; i++) { int j = getint(N); if (j==-1) { return -1; } N = N / j; System.out.println("N:"+N+" J:"+j); if (N==1) { break; } } return i; } int getint (int N) { for (int i=9; i>1; i--) { if (N%i==0) { return i; } } return -1; } }

TopCoder - SRM 424 DIV 2: 250

今回も英語に苦しみました・・・。英語勉強しないとですね。今回の問題は英大文字の文字列の中から、'A'と'Z'を抜き出し、その文字列の中で順番を反転するというもの。コードは ソースコードビューア に保存しました。いつも思うけどおれのコードは長い。 public class MagicSpell { public String fixTheSpell(String spell) { char[] c = spell.toCharArray(); int r = c.length; for (int i=0;i<c.length;i++) { if (c[i]=='A'||c[i]=='Z'){ System.out.println("i:"+c[i]); for (int j=r;j>0;j--) { if (c[j-1]=='A'||c[j-1]=='Z'){ System.out.println("j:"+c[j-1]); char temp = c[j-1]; c[j-1]=c[i]; c[i]=temp; r=j-1; break; } } } if (i>=r-1) { break; } } return new String(c); } }

TopCoder - SRM 144 DIV 2: 250

TopCoder勉強を開催。今回は8人が参加してくれた。と言っても俺も初心者だから、まずは登録(これが意外と面倒)からプラクティスルームにたどり着くまで。あとプラクティスでSRM 144 DIV 2:250を解いた。俺はJavaで。皆さん「おもしろい!」と言っていただいてなにより!TopCoderもっと流行って良いと思うw一番最初の問題なんだけど、秒数を数値型でインプットし、文字列型で"H:M:S"に変換してアウトプットする。うむ・・・今の問題と比較するとむちゃ簡単。。。 ソースコードビューア で見る。 public class Time { public String whatTime (int seconds) { int h = seconds/(60*60); int m = (seconds/60)%60; int s = seconds%60; return Integer.toString(h) + ":" + Integer.toString(m) + ":" + Integer.toString(s); } }

TopCoder勉強会 - vol.1

最近日本でもはやり始めたTopCoderの勉強会資料を作成した。まずは登録から練習までの流れ。日本語訳が少なく、登録もわかりにくいので、画面付きで解説してます。明日18時ぐらいから、このドキュメントから解説して、練習問題を解きます。Googleアカウントでログイン後、アクセスしていただけるとチャットが見えるかと思います。ライトフリーで公開するので、ご自由にお使いください。元データがほしい場合も、応じます。トラックバックとかコメントでお知らせいただけるとワクワクします。 ドキュメントリンク

TopCoder - SRM 422 DIV 2: 250

83.39点orz。まず英語を読むのに20分もかかった。 ソースコードビュアーで見る 。今回のミスはStringのlengthに()をつけてなかった。もうアフォですね。 public class MultiNumber { public String check(int number) { if (number<10) { return "NO"; } String s = Integer.toString(number); for (int i=0; i<s.length()-1; i++) { int n1 = 1; for (int j=0; j<=i; j++) { n1 *= Integer.valueOf(String.valueOf(s.charAt(j))); } int n2 = 1; for (int j=i+1; j<s.length(); j++) { n2 *= Integer.valueOf(String.valueOf(s.charAt(j))); } System.out.println ("n1: "+n1+", n2: "+n2); if (n1==n2){ return "YES"; } } return "NO"; } }

TopCoder - SRM 421 DIV 2: 250

public class GymTraining { public int trainingTime(int needToTrain, int minPulse, int maxPulse, int trainChange, int restChange) { if (minPulse < 50 || minPulse > 200) { return -1; } if (maxPulse < minPulse || maxPulse > 200) { return -1; } if (needToTrain < 1 || needToTrain > 200) { return -1; } if (needToTrain < 1 || needToTrain > 200) { return -1; } if (trainChange < 1 || trainChange > 200) { return -1; } if (restChange < 1 || restChange > 200) { return -1; } int time; int trained = 0; int pulse = minPulse; if(maxPulse < minPulse + trainChange) { return -1; } for(time=0; trained < needToTrain; time++) { if(maxPulse >= pulse + trainChange) { pulse += trainChange; trained++; } else { pulse -= restChange; } if(pulse < minPulse) pulse = minPulse; } return time; ...