SRM445 div2

Tags: ,
  2009/07/24 03:37

午前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)

次こそ緑ネームを!