練習再開。
SRM 437 Practice DIV1 500
DIV2の500問題(DIV1の250に同じ)は、結局人のコードを読んで納得。
メモ化かぁー。
悔しかったのでDIV1の500問題に挑戦。
import java.util.*;
public class TheInteger {
public long find(long n, int k) {
/* if (k == 1) {
Set<String> set = new HashSet<String>();
String s = String.valueOf(n);
String haji = s.substring(0, 1);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) sb.append(haji);
if (Long.parseLong(sb.toString()) >= n) return Long.parseLong(sb.toString());
}*/
double limit = (Long.MAX_VALUE / 10 < n) ? Long.MAX_VALUE : Math.max(n * 10, Math.pow(10, k));
long i;
for (i = n; i < limit; i++) {
if (countAndCompare(i, k)) break;
}
return i;
}
public boolean countAndCompare(long l, int k) {
Set<String> set = new HashSet<String>();
String s = String.valueOf(l);
for (int i = 0; i < s.length(); i++) {
set.add(s.substring(i, i + 1));
if (set.size() > k) return false;
}
if (set.size() == k) return true;
else return false;
}
与えられたテストケースは通り、いざシステムテストへ。
しかし通らない。。。値がどうのではなく、2秒を超えてしまう。
どれもk=1の時だったのでやけくそでコメントアウトされている行を書いてみる。
意地でもとりあえずシステムテストを通したい。。。
でも、そしたら別のところで引っかかる。やはり時間。
ああ、もうお手上げだよ。
人のコード見てしまうか。
SRM437 TopCoder
初参戦してきました。
最初なので自動的に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問目のスピードなのかな?
