SRM437 TopCoder

Tags:
  2009/03/27 01:41

初参戦してきました。
最初なので自動的にdiv2です。

Problem 250
数値のユニークな出現回数を計る問題。
最初配列でやって、面倒くさいのに気づきリストでやりなおした。

import java.util.*;
public class TheBeauty {
public int find(int n) {
List fined = new LinkedList();  

String ns = String.valueOf(n);
for (int i = 0; i < ns.length(); i++) {
 String s = ns.substring(i, i + 1);
 boolean isFind = false;  

 for (Iterator j = fined.iterator(); j.hasNext(); ) {
  int target = j.next();
  if (target == Integer.parseInt(s)) {
   isFind = true;
  }
 }  

 if (!isFind) {
  fined.add(Integer.parseInt(s));
 }
}  

   return fined.size();
}

たかがこんな問題で10分もかかってしまった。
その上、findの綴り間違っている。
そもそもfoundだし、findedでもないし(笑

そして後々気がついたんだけど、Hashを使えば簡単なことだった。
あんなに長いソースがたったこれだけの長さに。

import java.util.*;
public class TheBeauty2 {
public int find(int n) {
String s = String.valueOf(n);
Set set = new HashSet();
for (int i = 0; i < s.length(); i++) {
 set.add(s.substring(i, i + 1));
}
return set.size();
}

長さもさることながら分かりやすいよね。

Problem 500
250の問題の流れをちょっぴりくんでいる。
与えられた数を与えられた回数だけswapして最大値を求めなさい問題。

これはすっかり勘違いしてて、最小の値の探索までやってた。
それでもサンプルテストは通ったから怖い。

開いてから30分くらいしてからアルゴリズム自体が間違っていることに気づいててんぱる。
で、怖かったので送信すらしなかった。

ChallengePhaseで1回攻撃してみたものの失敗。
以下みたいなコードだった(気がする)

void a(int[] a, int b) {
  for (int i = 0; i < a.length; i++) {
    if ( a.length < b + 1){
      throw new IllegalArgumentException();
    }
  }
}

int bは直接攻撃できる値(だと思ってた)からいけいけでチャレンジ。
そしたら、何故かmainからハードコーディングされてた。意味不明。やられた。

結果
193pt
842(-358)

レートってこんなに下がるんだぁ。
しっかり2問目も解けるようにしないとなぁー
でも、div2で2問目解けてる人って一握り。
1問目のスピードなのかな?