SRM 460 div2

Tags:
  2010/02/07 04:29

最近SRMの記事しか書いていない。
勉強してないってことか。

Easy TheQuestionsAndAnswersDivTwo

YesNo問題の解答は何通りありますか?って問題。
ただ、重複するYesNo問題があって、その時解答は同じでなければならない。

HashSet使って、2^hash.size()するだけ。
こういう時Javaは便利だよね。

222.15

Midium TheFansAndMeetingsDivTwo

ここらへんで気づく、今日はボリビアがテーマだということを(笑

2人の人気者がいて、ファンがいる都市を訪問する。
ただ、多忙だから各々1都市ずつしか行けない。
各都市にはファンがいて、会えるファンの人数の最小と最大が決まっている。
同じ人数になるときの確率は?って問題。

別々にファンに会える人数の確率を求める。
ファンの人数は1~50だから全部計算して大丈夫。
で、それを突き合わせて、掛けて足すだけ。

public class TheFansAndMeetingsDivTwo {
    public double find(int[] minJ, int[] maxJ, int[] minB, int[] maxB) {
    	final int cities = minB.length;
    	double[] probabilityJ = new double[51];
    	double[] probabilityB = new double[51];
    	double result = 0.0;

    	/* John */
    	for (int i = 0; i < cities; i++) {
    		int w = maxJ[i] - minJ[i] + 1;
    		double p = (1.0 / (double)cities) * (1.0 / (double)w);
			for (int j = minJ[i]; j <= maxJ[i]; j++) {
				probabilityJ[j] += p;
			}
		}

    	/* Brus */
    	for (int i = 0; i < cities; i++) {
    		int w = maxB[i] - minB[i] + 1;
    		double p = (1.0 / (double)cities) * (1.0 / (double)w);
			for (int j = minB[i]; j <= maxB[i]; j++) {
				probabilityB[j] += p;
			}
		}

    	for (int i = 0; i <= 50; i++) {
			if (probabilityB[i] > 0 && probabilityJ[i] > 0) {
				result += probabilityB[i] * probabilityJ[i];
			}
		}

    	return result;
    }
}

334.21

Hard TheCitiesAndRoadsDivTwo

古い地図に道路足す問題。
書いてそれなりに自信があったから送ったんだけど、落とされてしまった。
なんでだろう?

public class TheCitiesAndRoadsDivTwo {
	boolean[][] path;
	int N;
	int[] group;

    public int find(String[] map) {
    	N = map.length;
    	path = new boolean[N][N];
    	group = new int[N];
    	int groupIndex = 0;

    	/* make path*/
    	for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				char c = map[i].charAt(j);
				if (c == 'Y') {
					path[i][j] = true;
					path[j][i] = true;
				}
			}
		}

    	/* make group */
    	for (int i = 0; i < group.length; i++) {
    		if (group[i] == 0) {
    			group[i] = ++groupIndex;
    			go(i, groupIndex);
    		}
		}

//    	System.out.println(Arrays.toString(group));

    	/* count path */
    	int count = 0;
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
				if (group[i] != group[j] && !path[i][j]) {
					count++;
					path[i][j] = true;
					path[j][i] = true;
				}
			}
		}

    	return (count > 0) ? count : 1;
    }

    void go(int from, int groupIndex){
    	for (int i = 0; i < N; i++) {
			if (path[from][i] && group[i] == 0) {
				group[i] = groupIndex;
				go(i, groupIndex);
			}
		}
    }
}

0.0

Challenge Phase

速攻Hardが落とされて凹む。
ちょろちょろ見るが集中力が限界。風呂に入る。

Result

Hardが通れば初の1000点代だったので、かなり悔しい。

Total 556.36
Rating 990(+49)

それもレートがあまり上がらずショックorz
後でHardは復習しよー

じゃ、おやすみなさい。
JPの皆様、深夜なのにお疲れ様でした。