ラベル TopCoder の投稿を表示しています。 すべての投稿を表示
ラベル TopCoder の投稿を表示しています。 すべての投稿を表示

2014年2月4日火曜日

SRM 606 Div2 Easy/Medum

前回から落ちまくってついに823まで落ちてます。。

SRM 606 Div2 Easy BoundingBox

MaxとMinの組み合わせだったということにパッと気づかなかったのが致命傷

class BoundingBox:
    def smallestArea(self, X, Y):
        return (max(X)-min(X))*(max(Y)-min(Y))

SRM 606 Div2 Medium PalindromicSubstringsDiv2

本番では、他の用事もあり解けず(言い訳)、他の人の回答を見て勉強しましたが、時間があっても解けなかったような気がします。
PythonだとTLEになってしまったが、Javaだとすんなり通った。
  public int count(String[] S1, String[] S2) {
  String string = "";
  for (String s : S1) {
   string += s;
  }
  for (String s : S2) {
   string += s;
  }
  int count = 0;
  for (int i = 0; i < string.length(); i++) {
   for (int j = 1; j < string.length(); j++) {
    if (0 <= i - j && i + j < string.length()
      && string.charAt(i - j) == string.charAt(i + j)) {
     count++;
    } else {
     break;
    }
   }
   for (int j = 0; j < string.length(); j++) {
    if (0 <= i - j && i + j + 1 < string.length()
      && string.charAt(i - j) == string.charAt(i + j + 1)) {
     count++;
    } else {
     break;
    }
   }

  }
  return count+string.length();
 }

2014年1月12日日曜日

SRM 604 Div2 Easy/Medum

990->1075 (+85) でした。(ベストスコア) 

個人的にはchallengeも成功したので面白い回でした。

SRM 604 Div2 Easy FoxAndWord

一瞬間に合うか心配でしたが、O(50^3) なので大丈夫そうです。

substringで並び替えて一致してるかチェックしてるだけです。


 一応こうすると、文字数のチェックもしなくてもいいです。
public int howManyPairs(String[] words)
 {
  int count = 0;
  for (int i = 0; i < words.length; i++) {
   for (int j = i + 1; j < words.length; j++) {
    if (check(words[i], words[j])) {
     count++;
    }
   }
  }
  return count;
 }

 private boolean check(String s, String s2) {
  for (int i = 1; i < s.length(); i++) {
   if (s2.equals(s.substring(i) + s.substring(0, i))) {
    return true;
   }
  }
  return false;
 }

SRM 604 Div2 Medium PowerOfThreeEasy


3進数に直して、(途中で2の数が出てくるとダメ) ビットっぽいのを求めて

ビットが重なっているか判定して、さらにビットが連続してるかどうか見ます。



 private static final String POSSIBLE = "Possible";
 private static final String IMPOSSIBLE = "Impossible";

 public String ableToGet(int x, int y)
 {
  int bitsX = get3Bits(x);
  int bitsY = get3Bits(y);
 if (bitsX == -1 || bitsY == -1) {
   return IMPOSSIBLE;
  }
  if ((bitsX & bitsY) > 0) {
   return IMPOSSIBLE;
  }
  int orBits = bitsX | bitsY;
  while (orBits > 0) {
   if ((orBits & 1) == 0) {
    return IMPOSSIBLE;
   }
   orBits >>= 1;
   
  }
  return POSSIBLE;
 }

 int get3Bits(int num) {
  int p = 0;
  int result = 0;
  while (num > 0) {
   if (num % 3 == 2) {
    return -1;
   }
   result |= (num % 3) << p;
   num /= 3;
   p++;
  }
  return result;
 }

2014年1月7日火曜日

SRM 603 Div2 Easy/Medium

SRM 602 Div3 Easy MiddleCode 

 回答

substringの仕様に気をつけて頑張るだけ
 substring(a,b) は aからb-1 までの文字


public String encode(String s)
 {
  String t = "";
  while (s.length() > 1) {
   int mid = s.length() / 2;
   if (s.length() % 2 == 1) {
    t += s.charAt(mid);
    s = s.substring(0, mid) + s.substring(mid + 1);
   } else {
    if (s.charAt(mid - 1) < s.charAt(mid)) {
     t += s.charAt(mid - 1);
     s = s.substring(0, mid - 1) + s.substring(mid);
    } else {
     t += s.charAt(mid);
     s = s.substring(0, mid) + s.substring(mid + 1);
    }
   }
  }
  return t + s;
 }

SRM 603 Div2 Medium SplitIntoPairs 

回答
なんとAを昇順にソートして、そのとなりの要素とかけてXより大きかをチェックするだけという。
あとは、オーバーフローに気をつけてlong にキャストするのは忘れずに
理由
負*負,正*正 はもちろん正になるため、普通にカウントできる
問題は
負*正 この組み合わせの時でこれがXより大きいかが問題。
ソートすると隣り合った負*正 が一番大きくなります。(絶対値が小さくなります)
これを判定するだけです。
そして、うまく組み合わせると こんなシンプルになります。
public int makepairs(int[] A, int X)
 {
  Arrays.sort(A);
  int count = 0;
  for (int i = 0; i < A.length ; i += 2) {
   if ((long) X <= ((long) A[i]) * A[i + 1]) {
    count++;
   }
  }
  return count;
 }

2013年12月7日土曜日

TopCoderのSRMで自動的に翻訳してくれるプラグインを作成しました。(非公式KawigiEdit拡張)


TopCoderのSRMの問題を翻訳してくれるプラグインを作成しました。
(正確に言うと、KawigiEditプラグインの機能追加です。)

今まで、わざわざ翻訳サイトに投げていた人に便利になると思います!!


Arenaで問題 を開くとすぐに翻訳してくれます。




特徴

  • (独自)問題を開いた瞬間に翻訳し、ウェブブラウザで表示します。(見やすい)
  • (独自)MICROSOFT TRANSLATORを使っています。 (ある程度まで無料なので)
  • (独自)ページをキャッシュするので、過去に表示していたら素早く表示します。
  • KawigiEdit 2.4を元に改造を行っているため、Java/C++/C#/VB/Python すべての言語に対応しております。
  • プラグインの導入が簡単
  • (独自)答えがあっているとき、Desired answerとYour answerを表示しない(自分が欲しかったので)


Downloadはこちらから
https://docs.google.com/file/d/0B-5M9QAsSoVbUXRYV25FbU5yZjg/edit?pli=1


設定方法

Name:  KawigiEdit-yuki
EntryPoint: kawigi.KawigiEdit
ClassPath: ダウンロードしたjarファイルのパス



その他の設定方法はKawigiEditと一緒なので、こちらのブログが詳しいです。

TopCoder: Setting up KawigiEdit
http://mogproject.blogspot.jp/2013/09/setting-up-kawigiedit.html



免責事項


  • 非公式なので諸事情で突然公開停止になる可能性がございます。
  • 翻訳精度に関しましては、翻訳サイト様にお願いして下さい。
  • このプラグインを入れても、直訳のため問題が分かることは保証できません。
    (現に、自分は英語のまま読んでます。。)

改造元
KawigiEdit-pfa 2.4.0 (unofficial)
https://apps.topcoder.com/forums/?module=Thread&threadID=794920&start=0&mc=1#1759241

2013年8月4日日曜日

[TopCoder]自分の解いた問題一覧を出してみました。

GitHubのMarkDownが面白そうだったので、せっかくなのでTopCoderの自分の解いた問題を一覧で表示するようにしてみました。

https://github.com/yuki2006/topcoder

ローカル側でREADME.mdを生成し、githubにあげたらいい感じに見えるようになってます。

今まで、どの過去問を解いたかなどの管理が一苦労だったので、これだけでも十分です。



こちらから一部ソースを拝借しました。
https://github.com/fornwall/eclipsecoder-archive

2013年8月2日金曜日

[TopCoder]SRM 587 Div2


Easy InsertZ

問題
http://community.topcoder.com/stat?c=problem_statement&pm=12700&rd=15699&rm=318350&cr=23018525

回答



Medium JumpFurther 

問題 




JumpFurther の方は、DP? DFS?とか結構悩んだけど、貪欲で行ってbadStepになってしまったら、最初の1stepを進まずにとどまるようにすれば、最大になります。

結構いい問題。

2013年7月22日月曜日

[TopCoder]初心者にオススメ問題

今回も、自分用のまとめです。
気づいた時に更新します。


始めてTopCoderをする方用にオススメの練習問題。
(わかりやすい問題)



もちろんすべてDiv2、上な問題ほどわかりやすいはず。





2013年7月20日土曜日

[TopCoder]SRM 585 Div 2

ブログを書くネタもあまりないので、プログラミングつながりということで 自分のまとめも兼ねてTopCoderのソースコードも公開して行きたいと思います。
 #本当は、ちゃんとしたアーカイブしたいけど

 ちなみに、ソースコードはGitHubのURLを貼るだけです。
 #リクエストがあれば何かするかも

 TopCoder自体は2年くらい前からやってましたが、スコアは低いです。頑張ります。

 というわけで早速。


 SRM 585 Div 2

 Easy

 LISNumberDivTwo
http://community.topcoder.com/stat?c=problem_statement&pm=12446

 ソース:
 https://raw.github.com/yuki2006/topcoder/master/src/LISNumberDivTwo.java 


 Medium 

TrafficCongestionDivTwo
http://community.topcoder.com/stat?c=problem_statement&pm=12697

 ソース:
https://github.com/yuki2006/topcoder/blob/master/src/TrafficCongestionDivTwo.java



特に、TrafficCongestionDivTwo の方は、興味深かったので説明書きます。

本番で書いたコードはなんとなく見つけた法則でのメモ化再起なんですが
SRM終了後に
他の人のエレガントなアルゴリズムを考えていた時に、見つけたアルゴリズムです。
(System Testには通りましたが、理論的に説明できません。。)

しかも、「倍数の証明 ジェネレータ」
http://tma.main.jp/baisuu/

というさらに興味深いサービス見つけたので、更にはかどりました。


高さh+1の完全二分木のノード数 は 2^h -1 です。

ここで問題でいう1つのパスを 葉のノード →その上のノード →右下の葉のノード
を順番にやっていくと最小のパス集合数になるのではと思いました。
(理論的に証明できません。。


ここで、 hが偶数のとき, ノード数は3の倍数になることの証明はこちら

2^(2n)  -1 = 4^n  -1 が 3の倍数であることの証明
http://tma.main.jp/baisuu/baisuu.php?eq=4%5En-1&num=3


また hが奇数の時、ノード数は3で割ったら1余る証明はこちら (少し変形してます

2^(2n+1)  -1 -1 が  3の倍数であることの証明
http://tma.main.jp/baisuu/baisuu.php?eq=2%5E%282*n%2B1%29-2+&num=3


つまり、
hが偶数の時は、先ほどの長さ3のパスの組み合わせで構成可能
hが奇数の時は、長さ3のパスの組み合わせで構成すると根のノードだけ残る(あまり1)

つまり、
  (2^h -1)/3 の切り上げの値が 最小のパス集合の数と等しくなるではないかと思いました。

2^h-1 % 3のあまりの最大値は1なので

切り上げを表現するためにテクニカルな方法を用いて+2にしました
つまりreturn文はなんと一行で表現出来ました。

return ((long) Math.pow(2, treeHeight + 1) - 1 + 2) / 3;

ツッコミお待ちしております。