<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>寝る前にラーメン &#187; TopCoder</title>
	<atom:link href="http://thleave.com/tag/tc/feed" rel="self" type="application/rss+xml" />
	<link>http://thleave.com</link>
	<description>学生エンジニアのコードに関する忘備録</description>
	<lastBuildDate>Mon, 30 Aug 2010 15:41:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SRM463 div2</title>
		<link>http://thleave.com/topcoder/234</link>
		<comments>http://thleave.com/topcoder/234#comments</comments>
		<pubDate>Tue, 02 Mar 2010 14:24:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=234</guid>
		<description><![CDATA[今日も疲労困憊で参戦。
そして、初の自宅以外での環境。

Easy BunnyPuzzle
ウサギパズル。ウサギかわいいよね。
ちょっとエンジンかかるの遅くて時間かかった。
179.60
Midium RabbitNum [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>今日も疲労困憊で参戦。<br />
そして、初の自宅以外での環境。</p>
<p><span id="more-234"></span></p>
<h3>Easy BunnyPuzzle</h3>
<p>ウサギパズル。ウサギかわいいよね。<br />
ちょっとエンジンかかるの遅くて時間かかった。</p>
<p>179.60</p>
<h3>Midium RabbitNumbering</h3>
<p>ウサギを数字でindentifyする。<br />
後で気づいたけど、0以上チェック要らないね。</p>
<p>[java]<br />
public class RabbitNumbering {<br />
	public int theCount(int[] maxNumber) {<br />
		final int N = maxNumber.length;<br />
		Arrays.sort(maxNumber);<br />
//		System.out.println(Arrays.toString(maxNumber));<br />
		long count = 1L;<br />
		for (int i = 0; i < N; i++) {<br />
			if (maxNumber[i] - i > 0) {<br />
				count *= maxNumber[i] &#8211; i;<br />
				count %= 1000000007;<br />
			} else {<br />
				return 0;<br />
			}<br />
		}<br />
//		System.out.println(&#8220;long=&#8221;+count);<br />
//		return (int)(count % 1000000007);<br />
		return (int)count;<br />
	}<br />
}<br />
[/java]</p>
<p>335.29</p>
<h3>Hard Nisoku</h3>
<p>「にそく」っていうカードゲーム（実在するのかは知らない、しないだろう）</p>
<p>任意の数のカードがある山から２枚とって足すか掛けるかしてその値のカードを戻す。<br />
最後の１枚の最大値を求める。</p>
<p>さっぱりわからなかった。<br />
最初与えられる山の配列が1.5~10.0なのが鍵くさいけど分からない。<br />
ちょっとここは勉強する。</p>
<p>0.0</p>
<h3>Challenge Phase</h3>
<p>傍観。<br />
立ち上がりのHard落としが今の流行？</p>
<p>0.0</p>
<h3>Result</h3>
<p>もうちょっと集中してやりたかったなあ。</p>
<p><strong>Total</strong> 509.89<br />
<strong>Rating</strong> 1009(+19)</p>
<p>レートの上がり方が異様に鈍い。<br />
前の戦績も影響するのかな。</p>
<p>みなさんお疲れ様でした。精進します。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/234/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM 460 div2</title>
		<link>http://thleave.com/topcoder/223</link>
		<comments>http://thleave.com/topcoder/223#comments</comments>
		<pubDate>Sat, 06 Feb 2010 19:29:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=223</guid>
		<description><![CDATA[最近SRMの記事しか書いていない。
勉強してないってことか。

Easy TheQuestionsAndAnswersDivTwo
YesNo問題の解答は何通りありますか？って問題。
ただ、重複するYesNo問題があって [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>最近SRMの記事しか書いていない。<br />
勉強してないってことか。</p>
<p><span id="more-223"></span></p>
<h3>Easy TheQuestionsAndAnswersDivTwo</h3>
<p>YesNo問題の解答は何通りありますか？って問題。<br />
ただ、重複するYesNo問題があって、その時解答は同じでなければならない。</p>
<p>HashSet使って、2^hash.size()するだけ。<br />
こういう時Javaは便利だよね。</p>
<p>222.15</p>
<h3>Midium TheFansAndMeetingsDivTwo</h3>
<p>ここらへんで気づく、今日はボリビアがテーマだということを(笑</p>
<p>２人の人気者がいて、ファンがいる都市を訪問する。<br />
ただ、多忙だから各々１都市ずつしか行けない。<br />
各都市にはファンがいて、会えるファンの人数の最小と最大が決まっている。<br />
同じ人数になるときの確率は？って問題。</p>
<p>別々にファンに会える人数の確率を求める。<br />
ファンの人数は1~50だから全部計算して大丈夫。<br />
で、それを突き合わせて、掛けて足すだけ。</p>
<p>[java]<br />
public class TheFansAndMeetingsDivTwo {<br />
    public double find(int[] minJ, int[] maxJ, int[] minB, int[] maxB) {<br />
    	final int cities = minB.length;<br />
    	double[] probabilityJ = new double[51];<br />
    	double[] probabilityB = new double[51];<br />
    	double result = 0.0;</p>
<p>    	/* John */<br />
    	for (int i = 0; i < cities; i++) {<br />
    		int w = maxJ[i] - minJ[i] + 1;<br />
    		double p = (1.0 / (double)cities) * (1.0 / (double)w);<br />
			for (int j = minJ[i]; j <= maxJ[i]; j++) {<br />
				probabilityJ[j] += p;<br />
			}<br />
		}</p>
<p>    	/* Brus */<br />
    	for (int i = 0; i < cities; i++) {<br />
    		int w = maxB[i] - minB[i] + 1;<br />
    		double p = (1.0 / (double)cities) * (1.0 / (double)w);<br />
			for (int j = minB[i]; j <= maxB[i]; j++) {<br />
				probabilityB[j] += p;<br />
			}<br />
		}</p>
<p>    	for (int i = 0; i <= 50; i++) {<br />
			if (probabilityB[i] > 0 &#038;&#038; probabilityJ[i] > 0) {<br />
				result += probabilityB[i] * probabilityJ[i];<br />
			}<br />
		}</p>
<p>    	return result;<br />
    }<br />
}<br />
[/java]</p>
<p>334.21</p>
<h3>Hard TheCitiesAndRoadsDivTwo</h3>
<p>古い地図に道路足す問題。<br />
書いてそれなりに自信があったから送ったんだけど、落とされてしまった。<br />
なんでだろう？</p>
<p>[java]<br />
public class TheCitiesAndRoadsDivTwo {<br />
	boolean[][] path;<br />
	int N;<br />
	int[] group;</p>
<p>    public int find(String[] map) {<br />
    	N = map.length;<br />
    	path = new boolean[N][N];<br />
    	group = new int[N];<br />
    	int groupIndex = 0;</p>
<p>    	/* make path*/<br />
    	for (int i = 0; i < N; i++) {<br />
			for (int j = 0; j < N; j++) {<br />
				char c = map[i].charAt(j);<br />
				if (c == 'Y') {<br />
					path[i][j] = true;<br />
					path[j][i] = true;<br />
				}<br />
			}<br />
		}</p>
<p>    	/* make group */<br />
    	for (int i = 0; i < group.length; i++) {<br />
    		if (group[i] == 0) {<br />
    			group[i] = ++groupIndex;<br />
    			go(i, groupIndex);<br />
    		}<br />
		}</p>
<p>//    	System.out.println(Arrays.toString(group));</p>
<p>    	/* count path */<br />
    	int count = 0;<br />
    	for (int i = 0; i < N; i++) {<br />
    		for (int j = 0; j < N; j++) {<br />
				if (group[i] != group[j] &#038;&#038; !path[i][j]) {<br />
					count++;<br />
					path[i][j] = true;<br />
					path[j][i] = true;<br />
				}<br />
			}<br />
		}</p>
<p>    	return (count > 0) ? count : 1;<br />
    }</p>
<p>    void go(int from, int groupIndex){<br />
    	for (int i = 0; i < N; i++) {<br />
			if (path[from][i] &#038;&#038; group[i] == 0) {<br />
				group[i] = groupIndex;<br />
				go(i, groupIndex);<br />
			}<br />
		}<br />
    }<br />
}<br />
[/java]</p>
<p>0.0</p>
<h3>Challenge Phase</h3>
<p>速攻Hardが落とされて凹む。<br />
ちょろちょろ見るが集中力が限界。風呂に入る。</p>
<h3>Result</h3>
<p>Hardが通れば初の1000点代だったので、かなり悔しい。</p>
<p><strong>Total</strong> 556.36<br />
<strong>Rating</strong> 990(+49)</p>
<p>それもレートがあまり上がらずショックorz<br />
後でHardは復習しよー</p>
<p>じゃ、おやすみなさい。<br />
JPの皆様、深夜なのにお疲れ様でした。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/223/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM459 div2</title>
		<link>http://thleave.com/topcoder/220</link>
		<comments>http://thleave.com/topcoder/220#comments</comments>
		<pubDate>Tue, 19 Jan 2010 18:09:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=220</guid>
		<description><![CDATA[今日は平和な部屋だった。
つか、問題が平和だった。

Easy RecursiveFigures
円と正方形の面積を足したり引いたりする問題。
楽勝・・・のはずが、型にやられた。
2.0とすべきところを2にしてしまった。 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>今日は平和な部屋だった。<br />
つか、問題が平和だった。</p>
<p><span id="more-220"></span></p>
<h3>Easy RecursiveFigures</h3>
<p>円と正方形の面積を足したり引いたりする問題。<br />
楽勝・・・のはずが、型にやられた。<br />
2.0とすべきところを2にしてしまった。しねばよい。</p>
<p>撃墜されず、システムで落ちた。<br />
当然のごとく、2.0にしたら通った <img src='http://thleave.com/wordpress/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>0.0</p>
<h3>Midium Inequalities</h3>
<p>不等号で表されている部分集合の式がたくさん渡されて、一番かぶる場所はどこ？って問題。<br />
ゴリ押しか良いアルゴリズムがあるか考えてみたけれど、<br />
時間が無くなったのでゴリ押しで書いた。</p>
<p>[java]<br />
    public int maximumSubset(String[] inequalities) {<br />
    	int[] subset = new int[2100];</p>
<p>    	for (int i = 0; i < inequalities.length; i++) {<br />
			String[] s = inequalities[i].split(" ");<br />
			int n = Integer.parseInt(s[2]);<br />
			if (s[1].equals(">=&#8221;)) {<br />
				for (int j = 2010; j >= n * 2 + 1; j&#8211;) subset[j]++;<br />
			} else if (s[1].equals(&#8220;>&#8221;)) {<br />
				for (int j = 2010; j > n * 2 + 1; j&#8211;) subset[j]++;<br />
			} else if (s[1].equals(&#8220;=&#8221;)){<br />
				subset[n*2+1]++;<br />
			} else if (s[1].equals(&#8220;<")) {<br />
				for (int j = 0; j < n * 2 + 1; j++) subset[j]++;<br />
			} else if (s[1].equals("<=")) {<br />
				for (int j = 0; j <= n * 2 + 1; j++) subset[j]++;<br />
			}<br />
		}</p>
<p>    	int result = 1;<br />
    	for (int i = 0; i < subset.length; i++) {<br />
			result = Math.max(result, subset[i]);<br />
		}<br />
    	return result;<br />
    }<br />
[/java]</p>
<p>そしたらみんなゴリ押しだったから笑った。<br />
すぐに書けばよかったなぁ。慎重すぎるかなあ。</p>
<h3>Hard ParkAmusement</h3>
<p>時間なかったから、問題よんだだけ。<br />
面白そうだったから後でやる。</p>
<h3>Challenge Phase</h3>
<p>なんか平和だった。<br />
部屋で撃墜0だったし、俺も突く場所がみつからなかった。</p>
<p>結果、<strong>219.64</strong>で341位。<br />
システム入る前で345位だったから、みんな相当落ちたんだね。</p>
<p><strong>941(+16)</strong></p>
<p>Easyとれば200位ぐらいだったみたいだから勿体無かったけど、<br />
こんな落とし方してもレート下がらなくなってきたのは良い傾向。</p>
<p>来月もがんばろう。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/220/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM456 div2</title>
		<link>http://thleave.com/topcoder/214</link>
		<comments>http://thleave.com/topcoder/214#comments</comments>
		<pubDate>Wed, 23 Dec 2009 04:05:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=214</guid>
		<description><![CDATA[働いてオールして働いて参戦。
もうへろへろだったけど、Redbullが俺に翼を授けた。

250 AppleWord
あっぽあっぽーするだけ。
小文字と大文字区別しないのを注意するくらいか。
218.92
500 Sil [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>働いてオールして働いて参戦。<br />
もうへろへろだったけど、Redbullが俺に翼を授けた。</p>
<p><span id="more-214"></span></p>
<h3>250 AppleWord</h3>
<p>あっぽあっぽーするだけ。<br />
小文字と大文字区別しないのを注意するくらいか。</p>
<p>218.92</p>
<h3>500 SilverDistance</h3>
<p>無限の広さの将棋盤で「銀」が動く。<br />
最短距離を求める。</p>
<p>探索では無理ぽいのでちょっと考えた。<br />
対角が最短で、ずれる場合だけ更にコストがかかる。<br />
前方90度はコスト0でずれれて、左右90度はコスト1、後方90度はコスト2。</p>
<p>[java]<br />
    public int minSteps(int sx, int sy, int gx, int gy) {<br />
    	final int x = gx &#8211; sx;<br />
    	final int y = gy &#8211; sy;</p>
<p>    	int cost = Math.max(Math.abs(x),Math.abs(y));<br />
    	if (Math.abs(x &#8211; y) % 2 == 1) {<br />
    		if ((0 < x - y) &#038;&#038; (0 > x+ y)) cost +=2;<br />
    		else if ((0 < x - y) || (0 > x+ y)) cost++;<br />
    	}</p>
<p>    	return cost;<br />
    }<br />
[/java]</p>
<p>SRM中にしては、すっきり書けた気がする。</p>
<p>229.93</p>
<h3>1000 CutSticks</h3>
<p>与えられたスティックを指定された回数だけ2つに均等に刻む。<br />
降順ソートしたとき、K番目が最大長になるときの長さを返す。</p>
<p>基本的にK番目の後ろから刻む。<br />
後ろがないときは一番長いのを刻む。後ろがわいたらそっちを刻む。<br />
毎回ソートする。</p>
<p>みたいなんで解けそうと思った。けど、刻む回数が最大1billionとか<br />
結局考えてるうちに、かけなくなった。</p>
<h3>Challenge Phase</h3>
<p>洗濯物干してたら時間やばいやばい。<br />
250の大文字小文字で結構落ちてて、狙えばよかったと後悔。</p>
<p>500くらいしか狙えそうになかったので、Javaで点数近い人読む。<br />
したら境界条件が若干自分と違う。<br />
コスト1の範囲を考えてないぽい。でも、ケース作ってるうちに落とされたorz もたいない。</p>
<p>今日も頑張った。<br />
<strong>448.85</strong><br />
122位で<strong><span style="color: #008000;">912(+93)</span></strong></p>
<p>やっと緑ネーム。ちょっと抜け出した。<br />
来年はDiv1目指してがんばる。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/214/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Member SRM455 div2</title>
		<link>http://thleave.com/topcoder/210</link>
		<comments>http://thleave.com/topcoder/210#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:34:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=210</guid>
		<description><![CDATA[昨日SRMのメールが届いてて、「あれ？明日？」って思ったらMemberだった。
けど、レートに影響あるんだ。これどういう扱いなんだろうね。

Easy SpidersOnTheGrid
クモ問題。書くだけ。
205.09 [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>昨日SRMのメールが届いてて、「あれ？明日？」って思ったらMemberだった。<br />
けど、レートに影響あるんだ。これどういう扱いなんだろうね。</p>
<p><span id="more-210"></span></p>
<h3>Easy SpidersOnTheGrid</h3>
<p>クモ問題。書くだけ。</p>
<p>205.09</p>
<h3>Midium EasySequence</h3>
<p>無限配列の部分配列(B[])が与えられて、そのindexを返せという問題。<br />
無限配列の定義は、、、</p>
<ul>
<li>A[0], A[1], &#8230;, A[N-1] are given;</li>
<li>A[i]=(A[i-1]+A[i-2]+&#8230;+A[i-N])%10 for all i>=N;</li>
</ul>
<p>素直に解けば解けそう！と思ったので、わりかしすぐにコード書いてみた。<br />
部分配列の頭の場所さえわかれば良いので、<br />
indexと必要な長さの分だけ（=Math.max(A.length,B.length)）配列を覚えておくことにした。</p>
<p>多分、方針は間違ってない。</p>
<p>[java]<br />
    public int find(int[] A, int[] B) {<br />
    	LinkedList<Integer> substring = new LinkedList<Integer>();<br />
    	final int N = A.length;<br />
    	final int M = B.length;<br />
    	int index = 0;</p>
<p>    	// substring.size() <= M<br />
    	while (true) {<br />
    		if (index >= N) {<br />
	    		int sum = 0;<br />
	    		for (int i = 1; i <= N; i++) {<br />
	    			// 後ろからN個分足す。<br />
	    			sum += substring.get(substring.size() - i);<br />
				}<br />
	    		substring.add(sum % 10);</p>
<p>    		} else {<br />
    			substring.add(A[index]);<br />
    		}</p>
<p>    		// メモリ気にする(max=50)<br />
    		while (substring.size() > M &#038;&#038; substring.size() > N){<br />
    			substring.removeFirst();<br />
    		}</p>
<p>    		if (substring.size() >= M) {<br />
    			boolean res = true;<br />
    			// M個比較する<br />
    			for (int i = 1; i <= M; i++) {<br />
					if (!substring.get(substring.size() - i).equals(B[M - i])) res = false;<br />
				}<br />
    			if (res) break;<br />
    		}</p>
<p>    		if (substring.size() >= N &#038;&#038; index >= N &#038;&#038; index >= M) {<br />
				boolean failed = true;<br />
				// N個比較する<br />
				for (int i = 1; i <= N; i++) {<br />
					if (!substring.get(substring.size() - i).equals(A[N - i])) failed = false;<br />
				}<br />
				if (failed) return -1;<br />
    		}</p>
<p>//    		System.out.println(index + "..." + substring.toString());</p>
<p>    		index++;<br />
    	}</p>
<p>    	return index-M+1;<br />
    }<br />
[/java]</p>
<p>ここまでは素直に書けたんだけど、<strong>終了条件</strong>が分からない。<br />
無限配列だし、、、Integer.MAX_VALUEまでやるわけにはいかないし、、、<br />
で、悩んだ末にA[]がまた出てきたら終わることにした。けど、通るわけなひよね。<br />
とゆか送らなかった。</p>
<p>0.0</p>
<h3>Challenge Phase</h3>
<p>自分がMidiumの終端条件で悩んでいたので、それで攻めた。<br />
index == A.length ^ 2で終わりにしてる人がいたので、それはないだろうと思い、<br />
A.length = 3 で、部分配列を12くらいにして送ってみたら落ちた。</p>
<p>50.0</p>
<p>Total 255.09</p>
<p>しょっぱいけど、250ってある意味１枚目の壁だよね。<br />
<strong>821(+113)</strong><br />
早くこの泥沼から抜け出したい。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/210/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM454 div2</title>
		<link>http://thleave.com/topcoder/184</link>
		<comments>http://thleave.com/topcoder/184#comments</comments>
		<pubDate>Mon, 07 Dec 2009 15:02:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[TopCoder]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=184</guid>
		<description><![CDATA[眠いけど、一応出た。

Easy MinimalDifference
問題文を忠実にコードに起こすだけ。
速攻テスト通ったー！と思って油断してたら、for文の範囲ミスってて撃墜されたorz
2文字切っただけでシステム通っ [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>眠いけど、一応出た。</p>
<p><span id="more-184"></span></p>
<h3>Easy MinimalDifference</h3>
<p>問題文を忠実にコードに起こすだけ。<br />
速攻テスト通ったー！と思って油断してたら、for文の範囲ミスってて撃墜されたorz<br />
2文字切っただけでシステム通った。</p>
<p>0.0</p>
<h3>Midium WordsGame</h3>
<p>文字がN個xN個の格子状に配置されていて、<br />
与えられた長さNの文字列に<strong>一致(*1)</strong>するように<strong>swap(*2)</strong>を繰り返す。<br />
*1 <strong>一致</strong>は「上から下」か「左から右」のみ。斜めとかなし。<br />
*2 <strong>swap</strong>は列同士か行同士しかできない。文字単位ではNG<br />
もし完成すれば最小コストを返せという問題。</p>
<p>N <= 50なので、単純な探索は無理。</p>
<p>ただ、swapできると言っても、列か行単位のみ。<br />
ということは、もし「左から右」の行で完成する場合は、列swapのみ。<br />
逆に、「上から下」の列で完成する場合は、行swapしかしないことになる。</p>
<p>なので、列か行単位でみてけばよい。<br />
2N個の長さNの文字配列を与えられた長さNの文字列に近づける。<br />
ずいぶん簡単になった。</p>
<p>[java]<br />
public class WordsGame {<br />
	String[] strings;<br />
	int cost = Integer.MAX_VALUE;</p>
<p>	public int minimumSwaps(String[] grid, String word) {<br />
		strings = new String[grid.length * 2];</p>
<p>		for (int i = 0; i < grid.length; i++) {<br />
			strings[i] = grid[i];<br />
		}<br />
		for (int i = 0; i < grid.length; i++) {<br />
			StringBuilder sb = new StringBuilder();<br />
			for (int j = 0; j < grid.length; j++) {<br />
				sb.append(grid[j].charAt(i));<br />
			}<br />
			strings[i + grid.length] = sb.toString();<br />
		}</p>
<p>		for (int i = 0; i < strings.length; i++) {<br />
			solve(word, strings[i], 0, 0);<br />
		}</p>
<p>		return (this.cost == Integer.MAX_VALUE) ? -1 : this.cost;<br />
	}</p>
<p>	public void solve(String s, String t, int index, int cost) {<br />
//		System.out.println("#solve index="+index+", cost="+cost+", src="+s+", target="+t);</p>
<p>		char[] src = s.toCharArray();<br />
		char[] target = t.toCharArray();</p>
<p>		if (src[index] == target[index]) {<br />
			if (src.length == index + 1) {<br />
				// 完全まっち！ => END<br />
				this.cost = Math.min(cost, this.cost);<br />
			} else {<br />
				solve(s, t, index + 1, cost);<br />
			}<br />
		} else {<br />
			int pos = index;<br />
			LinkedList<Integer> hit = new LinkedList<Integer>();<br />
			while (true) {<br />
				pos = search(target, src[index], pos);<br />
				if (pos == -1) break;<br />
				hit.add(pos++);<br />
			}</p>
<p>			if (hit.size() > 0) {<br />
				while (hit.size() > 0) {<br />
					int to = hit.poll();<br />
					swap(target, index, to);<br />
					solve(s, new String(target), index + 1, cost + 1);<br />
					swap(target, to, index);<br />
				}<br />
			}<br />
		}<br />
	}</p>
<p>	public void swap(char[] c, int from, int to) {<br />
		char temp = c[from];<br />
		c[from] = c[to];<br />
		c[to] = temp;<br />
	}</p>
<p>	public int search(char[] c, char target, int start) {<br />
		for (int i = start; i < c.length; i++) {<br />
			if (c[i] == target)<br />
				return i;<br />
		}<br />
		return -1;<br />
	}<br />
}<br />
[/java]</p>
<p>0.0</p>
<p>でも、競技中に間に合わなかった(笑<br />
超レート下がったyo</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/184/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM453</title>
		<link>http://thleave.com/contests/169</link>
		<comments>http://thleave.com/contests/169#comments</comments>
		<pubDate>Sun, 29 Nov 2009 17:52:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[プログラミングコンテスト]]></category>
		<category><![CDATA[TopCoder]]></category>

		<guid isPermaLink="false">http://thleave.com/?p=169</guid>
		<description><![CDATA[今更だけど、ちゃんと出ようとしたんだよ！って記録。
関係者の皆さん知っての通り、サーバー激重で落ちてなむ。
その埋め合わせか知らないけど、SRM453.5ってのがあったけど、
時間が合わず出れなかった。級すぎるよ : ( [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>今更だけど、ちゃんと出ようとしたんだよ！って記録。<br />
関係者の皆さん知っての通り、サーバー激重で落ちてなむ。</p>
<p>その埋め合わせか知らないけど、SRM453.5ってのがあったけど、<br />
時間が合わず出れなかった。級すぎるよ : (</p>
<p>最近全然出てないので、SRM454は出たい。出たい。出たい。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/contests/169/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM445 div2</title>
		<link>http://thleave.com/topcoder/61</link>
		<comments>http://thleave.com/topcoder/61#comments</comments>
		<pubDate>Thu, 23 Jul 2009 18:37:09 +0000</pubDate>
		<dc:creator>tchiba</dc:creator>
				<category><![CDATA[TopCoder]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://thleaves.railsplayground.net/?p=61</guid>
		<description><![CDATA[午前0時スタート。
バイトでむしゃくしゃしてたので、それが晴れればいいなぁーと。
今回は300-500-1000の配点で、The&#8230;シリーズ。
最初に躓かないかちょっと不安だったけど、取り越し苦労だった。

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

		<guid isPermaLink="false">http://thleaves.railsplayground.net/?p=57</guid>
		<description><![CDATA[2009/09までにTopCoder Rate1200越えを目標にしました。
何か目標にしないとICPCのショックから立ち直れない・・・。
バイト終わりで眠くてしんどかったのですが、気合いでSRM出ました。

Probl [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>2009/09までにTopCoder Rate1200越えを目標にしました。<br />
何か目標にしないとICPCのショックから立ち直れない・・・。</p>
<p>バイト終わりで眠くてしんどかったのですが、気合いでSRM出ました。</p>
<p><span id="more-57"></span></p>
<p><strong>Problem 250 FourBlocksEasy</strong></p>
<p>最初は、えーこれ探索？面倒くさそって思ったけど、<br />
後からセルの高さが2という事実に気づく。</p>
<p>[java]<br />
    public int maxScore(String[] grid) {<br />
        int result = 0;</p>
<p>        boolean[][] map = new boolean[2][grid[0].length()];</p>
<p>        for (int i = 0; i < 2; i++) {<br />
			for (int j = 0; j < grid[0].length(); j++) {<br />
				if (grid[i].charAt(j) == '1') {<br />
					map[i][j] = true;<br />
					result++;<br />
				}<br />
			}<br />
		}</p>
<p>        // 4x4<br />
        for (int i = 0; i < grid[0].length() - 1; i++) {<br />
			if (!map[0][i] &#038;&#038; !map[0][i + 1] &#038;&#038; !map[1][i] &#038;&#038; !map[1][i + 1]) {<br />
				map[0][i] = true;<br />
				map[0][i + 1] = true;<br />
				map[1][i] = true;<br />
				map[1][i + 1] = true;<br />
				result += 16;<br />
			}<br />
		}</p>
<p>        for (int i = 0; i < 2; i++) {<br />
			for (int j = 0; j < grid[0].length(); j++) {<br />
				if (!map[i][j]) result++;<br />
			}<br />
		}</p>
<p>        return result;<br />
    }<br />
[/java]</p>
<p>208.51</p>
<p><strong>Problem 500 NumericalPerfectionLevel</strong></p>
<p>これも最初、問題の意味が分からなかった。<br />
例がなかったらきっと一生解読できなかったと思う。</p>
<p>素数を使うオーラは感じたけど、面倒くさかったので枝刈り無しで。<br />
バカだった。ICPCボケだなぁ。</p>
<p>[java]<br />
public class NumericalPerfectionLevel {<br />
    public int getLevel(long N) {<br />
    	int count = 0;<br />
    	for (long i = 2; i <= N; i++) {<br />
			while (N % i == 0) {<br />
				count++;<br />
				N /= i;<br />
			}<br />
			if (N <= i) break;<br />
		}</p>
<p>    	int k = 0;<br />
    	for (int i = 4; i <= count; i *= 4, k++);<br />
    	return k;<br />
    }<br />
[/java]</p>
<p>4回守ったが、5回目にやられてた。<br />
後で試したら1ケースだけTLE・・・あぁ。<br />
0.0</p>
<p><strong>Problem1000 RotatingTriangles</strong><br />
これDiv1の1問目なの？<br />
人のblogしか読んでないから分からないけど、だったたとしたら恐ろしい。</p>
<p>つっても、ちょろちょろ解読してると意外と探索でいけそうだなぁ。<br />
書いてみようかなぁーでも眠い・・・でダウン。</p>
<p>Challengeは出てないけど、起きたら500が落ちててしょぼん。<br />
でもレートはあがってた。元がひどいからか。<br />
次は2問といて緑ネ目指すぞー。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/57/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRM440 div2</title>
		<link>http://thleave.com/topcoder/27</link>
		<comments>http://thleave.com/topcoder/27#comments</comments>
		<pubDate>Tue, 12 May 2009 12:54:24 +0000</pubDate>
		<dc:creator>tchiba</dc:creator>
				<category><![CDATA[TopCoder]]></category>

		<guid isPermaLink="false">http://thleaves.railsplayground.net/?p=27</guid>
		<description><![CDATA[久しぶりのTopcoder
あんまり緊張せずにできた。

problem 250 
ただの数学の問題。式変形して重力加速度を求めましょう！という問題でした。
Math. cbrtとMath.sqrtを間違えて無駄な時間を [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>久しぶりのTopcoder<br />
あんまり緊張せずにできた。</p>
<p><span id="more-27"></span></p>
<p><strong>problem 250</strong><strong> </strong></p>
<p>ただの数学の問題。式変形して重力加速度を求めましょう！という問題でした。<br />
Math. cbrtとMath.sqrtを間違えて無駄な時間を食う。<br />
なんかJavaに振り回されている気がする。</p>
<p><strong>problem 500</strong></p>
<p>定番の迷路問題をちょっとだけひねった問題。<br />
最短経路の問題ではなく、分岐の数がいくつあるか求めよという問題。<br />
でも、解法は再帰で1発。<br />
だが、あとちょっとでsubmitできなかった。<br />
250問題でバカなことしてなければ間に合ったと悔やむ。<br />
終わってから通したらあっさり通りました。<br />
あーあーあーあー</p>
<p>[java]<br />
public class MazeWanderingEasy {<br />
	boolean atta = false;<br />
	int count = 0;</p>
<p>    public int decisions(final String[] maze) {<br />
    	int startx = 0, starty = 0;<br />
    	String[][] m = new String[maze[0].length()][maze.length];<br />
    	for (int i = 0; i < maze[0].length(); i++) {<br />
    		for (int j = 0; j < maze.length; j++) {<br />
    			m[i][j] = maze[j].substring(i, i + 1);<br />
    			if (m[i][j].equals("M")) {<br />
    				startx = i;<br />
    				starty = j;<br />
    			}<br />
    		}<br />
    	}<br />
    	go(startx, starty, m, 0);<br />
    	return this.count;<br />
    }</p>
<p>    public int check(int x, int y, String[][] m) {<br />
    	int check = 0;</p>
<p>    	if (x - 1 >= 0 &#038;&#038; (m[x - 1][y].equals(&#8220;.&#8221;) || m[x - 1][y].equals(&#8220;*&#8221;))) check++;<br />
    	if (y &#8211; 1 >= 0 &#038;&#038; (m[x][y - 1].equals(&#8220;.&#8221;) || m[x][y - 1].equals(&#8220;*&#8221;))) check++;<br />
    	if (x + 1 < m.length &#038;&#038; (m[x + 1][y].equals(".") || m[x + 1][y].equals("*"))) check++;<br />
    	if (y + 1 < m[0].length &#038;&#038; (m[x][y + 1].equals(".") || m[x][y + 1].equals("*"))) check++;</p>
<p>    	return check;<br />
    }</p>
<p>    public void go(int x, int y, String[][] m, int d){<br />
    	wrap : if (!atta) {<br />
	    	if (m[x][y].equals("*")) {<br />
	    		atta = true;<br />
	    		this.count = d;<br />
	    		break wrap;<br />
	    	}<br />
	    	m[x][y] = "_";<br />
	    	if (check(x, y, m) > 1) d++;<br />
	    	System.out.println(d);</p>
<p>	    	if (x &#8211; 1 >= 0 &#038;&#038; (m[x - 1][y].equals(&#8220;.&#8221;) || m[x - 1][y].equals(&#8220;*&#8221;))) go(x &#8211; 1, y, m, d);<br />
	    	if (y &#8211; 1 >= 0 &#038;&#038; (m[x][y - 1].equals(&#8220;.&#8221;) || m[x][y - 1].equals(&#8220;*&#8221;))) go(x, y &#8211; 1, m, d);<br />
	    	if (x + 1 < m.length &#038;&#038; (m[x + 1][y].equals(".") || m[x + 1][y].equals("*"))) go(x + 1, y, m, d);<br />
	    	if (y + 1 < m[0].length &#038;&#038; (m[x][y + 1].equals(".") || m[x][y + 1].equals("*"))) go(x, y + 1, m, d);<br />
    	}<br />
    }<br />
}<br />
[/java]</p>
<p>イチイチ２次元配列作ったり、同じソースがあったりする点が無駄だったと反省しています。<br />
でもなー、せめて配列は組み直さないとバグでそうなんだよなぁー、俺の頭だと。</p>
<p><strong>problem 1000</strong></p>
<p>開けるわけがない～</p>
<p>経験不足が露呈。もったいないなぁー<br />
次はもうちょっと頑張ります。<br />
せめて緑ネームになりたいのです。</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://thleave.com/topcoder/27/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
