SRM445 div2
午前0時スタート。
バイトでむしゃくしゃしてたので、それが晴れればいいなぁーと。
今回は300-500-1000の配点で、The…シリーズ。
最初に躓かないかちょっと不安だったけど、取り越し苦労だった。
Problem 300
入力の暗号化。
辞書順なので楽ちん。
Hash使えば楽勝。
281.63
public String encrypt(String message) {
HashMap<Character, Character> map = new HashMap<Character, Character>();
StringBuilder r = new StringBuilder();
int pointer = 0;
for (int i = 0; i < message.length(); i++) {
char c = message.charAt(i);
if (!map.containsKey(c)) {
map.put(c, (char)('a' + pointer++));
}
r.append(map.get(c));
}
return r.toString();
}
Problem 500
家を建てよう。
だけど、お隣さんが上下左右にいないと不安だって。
それはいいとして、古い家をぶっこわすなんてエコじゃないね。
要するに、家の上に家って考え方が無くて、時間食っちゃった。
263.47
public class TheNewHouseDivTwo {
public int count(int[] x, int[] y) {
boolean[][] map = new boolean[201][201];
boolean[][] build = new boolean[201][201];
for (int i = 0; i < x.length; i++) {
int a = x[i] + 100;
int b = y[i] + 100;
map[a][b] = true;
}
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map.length; j++) {
if (map[i][j]) {
build[i][j] = true;
break;
}
else build[i][j] = true;
}
}
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map.length; j++) {
if (map[j][i]) {
build[j][i] = true;
break;
}
else build[j][i] = true;
}
}
for (int i = map.length - 1; i >= 0; i--) {
for (int j = map.length - 1; j >= 0; j--) {
if (map[i][j]) {
build[i][j] = true;
break;
}
else build[i][j] = true;
}
}
for (int i = map.length - 1; i >= 0; i--) {
for (int j = map.length - 1; j >= 0; j--) {
if (map[j][i]) {
build[j][i] = true;
break;
}
else build[j][i] = true;
}
}
int count = 0;
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map.length; j++) {
if (!build[i][j]) count++;
}
}
// for (int i = 100; i < 110; i++) {
// for (int j = 100; j < 110; j++) {
// if (build[i][j]) System.out.print("o");
// else System.out.print("x");
// System.out.print(" ");
// }
// System.out.println();
// }
return count;
}
Problem 1000
01で暗号を作る話。
途中まで書いたけど、暗号を組み直す部分でミスって間に合わなかった。
0か1しか変えられないって部分を理解してなかったのです。
30分以上あったからもっとアルゴリズムに時間をかければよかった。
以下のコードは途中で余分なの消した。
HashSet<String> used;
TreeSet<String> kouho;
String yesterday;
public String password(final int N, final int K) {
used = new HashSet<String>();
kouho = new TreeSet<String>();
// first day
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) sb.append("0");
used.add(yesterday = sb.toString());
// day
char[] c = new char[N];
for (int i = 1; i < K; i++) {
make(c, 0);
System.out.println(kouho.first());
c = kouho.first().toCharArray();
used.add(kouho.first());
yesterday = kouho.first();
kouho.clear();
}
return new String(c);
}
public void make(char[] password, int pointer){
if (pointer == password.length) {
if (!used.contains(new String(password))) {
kouho.add(new String(password));
}
} else {
password[pointer] = '0';
make(password, pointer + 1);
password[pointer] = '1';
make(password, pointer + 1);
}
}
Challenge Phase
とりあえず、C++とかよく分からないので、Javaの人だけ見て回る。
500点問題でTLEしそうな人がいたので、WorstCaseを作ってなげてみた。
そしたら、WAで成功した。うーん、結果オーライ。
+50.0
SystemTest
何も落ちなかった。
自己ベスト。
595.10
でも、解いてて思ったけど、今日は難易度が低めだった。
Div2でもHARDを解いてる人が沢山いたし、現に俺ももう少しで解けそうだったし、
もっと前半から攻めるべきだったと反省。
855(+68)
次こそ緑ネームを!
