﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Snowdream-随笔分类-Algorithm</title><link>http://www.blogjava.net/zellux/category/22032.html</link><description>迷茫的大二：读书 思考 等待</description><language>zh-cn</language><lastBuildDate>Wed, 23 Apr 2008 17:14:43 GMT</lastBuildDate><pubDate>Wed, 23 Apr 2008 17:14:43 GMT</pubDate><ttl>60</ttl><item><title>URAL 1011</title><link>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 23 Apr 2008 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/195333.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/23/195333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/195333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/195333.html</trackback:ping><description><![CDATA[
		<h3 class="subtitle">Problem</h3>
		<p>Every bus in the Ekaterinburg city has a special man (or woman) called 
conductor. When you ride the bus, you have to give money to the conductor.
We know that there are more then <i>P</i>% conductors and less then <i>Q</i>% conductors.
Your task is to determine a minimal possible number of Ekaterinburg citizens. <br /></p>
		<br />我只能说太挫了。。。精度问题搞了半天，看来浮点还是要尽量化成整型再算啊。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><img id="Code_Closed_Image_224337" onclick="this.style.display='none'; Code_Closed_Text_224337.style.display='none'; Code_Open_Image_224337.style.display='inline'; Code_Open_Text_224337.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" height="16" width="11" /><img id="Code_Open_Image_224337" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_224337.style.display='none'; Code_Closed_Image_224337.style.display='inline'; Code_Closed_Text_224337.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" height="16" width="11" /><span id="Code_Closed_Text_224337" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);"></span><span id="Code_Open_Text_224337" style="display: none;"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">iostream</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">#include </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">cmath</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">using</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">namespace</span><span style="color: rgb(0, 0, 0);"> std;<br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> main()<br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">double</span><span style="color: rgb(0, 0, 0);"> dp, dq;<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    cin </span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);"> dp </span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);"> dq;<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> floor(dp </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0.5</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> q </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> floor(dq </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0.5</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">; ; i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">) {<br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> a </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> p </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> b </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> q </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ((a </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> b) </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> (q </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)) {<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);">            cout </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> endl;<br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">}<br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);"></span></span></div><br />还有个问题就是q*i是开区间还是闭区间，总之Wrong Answer了无数次后总算过了。。。<br /><img src ="http://www.blogjava.net/zellux/aggbug/195333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-23 22:44 <a href="http://www.blogjava.net/zellux/archive/2008/04/23/195333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URAL 题解 - wiki</title><link>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 17 Apr 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/193697.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/17/193697.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/193697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/193697.html</trackback:ping><description><![CDATA[
		<a href="http://www.nocow.cn/index.php">http://www.nocow.cn/index.php</a>
		<br />
		<br />抽时间多做做，提高下我可怜的算法功底 &gt;,&lt;<img src ="http://www.blogjava.net/zellux/aggbug/193697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-17 11:48 <a href="http://www.blogjava.net/zellux/archive/2008/04/17/193697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《编程之美》上的一道题目的讨论</title><link>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 14 Apr 2008 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/192955.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/15/192955.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/192955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/192955.html</trackback:ping><description><![CDATA[
		<p>计算机科学论坛最近举办了一个阅读样章，提交书评的活动，具体内容请见<a href="http://www.ieee.org.cn/dispbbs.asp?boardID=42&amp;ID=61162">http://www.ieee.org.cn/dispbbs.asp?boardID=42&amp;ID=61162</a>。</p>
		<p>这里我想针对样章上的一个问题谈谈自己的理解。</p>
		<p>问题很简单，求二进制中1的个数。对于一个字节（8bit）的变量，求其二进制表示中"1"的个数，要求算法的执行效率尽可能的高。</p>
		<p>先来看看样章上给出的几个算法：</p>
		<p>解法一，每次除二，看是否为奇数，是的话就累计加一，最后这个结果就是二进制表示中1的个数。</p>
		<p>解法二，同样用到一个循环，只是里面的操作用位移操作简化了。</p>
		<p>
				<font face="Courier New">   1:  int Count(int v)   <br />   2:  {   <br />   3:      int num = 0;<br />   4:      while (v) {   <br />   5:          num += v &amp; 0x01;   <br />   6:          v &gt;&gt;= 1;   <br />   7:      }   <br />   8:      return num;   <br />   9:  }</font>
		</p>
		<p>解法三，用到一个巧妙的与操作，v &amp; (v -1 )每次能消去二进制表示中最后一位1，利用这个技巧可以减少一定的循环次数。</p>
		<p>解法四，查表法，因为只有数据8bit，直接建一张表，包含各个数中1的个数，然后查表就行。复杂度O(1)。</p>
		<p>
				<font face="Courier New">   1:  int countTable[256] = { 0, 1, 1, 2, 1, ..., 7, 7, 8 };   <br />   2:      <br />   3:  int Count(int v) {   <br />   4:      return countTable[v];   <br />   5:  }<br /></font>   <br />好了，这就是样章上给出的四种方案，下面谈谈我的看法。</p>
		<p>首先是对算法的衡量上，复杂度真的是唯一的标准吗？尤其对于这种数据规模给定，而且很小的情况下，复杂度其实是个比较次要的因素。</p>
		<p>查表法的复杂度为O(1)，我用解法一，循环八次固定，复杂度也是O(1)。至于数据规模变大，变成32位整型，那查表法自然也不合适了。</p>
		<p>其次，我觉得既然是这样一个很小的操作，衡量的尺度也必然要小，CPU时钟周期可以作为一个参考。</p>
		<p>解法一里有若干次整数加法，若干次整数除法（一般的编译器都能把它优化成位移），还有几个循环分支判断，几个奇偶性判断（这个比较耗时间，根据CSAPP上的数据，一般一个branch penalty得耗掉14个左右的cycle），加起来大概几十个cycle吧。</p>
		<p>再看解法四，查表法看似一次地址计算就能解决，但实际上这里用到一个访存操作，而且第一次访存的时候很有可能那个数组不在cache里，这样一个cache miss导致的后果可能就是耗去几十甚至上百个cycle（因为要访问内存）。所以对于这种“小操作”，这个算法的性能其实是很差的。</p>
		<p>这里我再推荐几个解决这个问题的算法，以32位无符号整型为例。</p>
		<p>
				<font face="Courier New">   1:  int Count(unsigned x) {   <br />   2:     x = x - ((x &gt;&gt; 1) &amp; 0x55555555);    <br />   3:     x = (x &amp; 0x33333333) + ((x &gt;&gt; 2) &amp; 0x33333333);    <br />   4:     x = (x + (x &gt;&gt; 4)) &amp; 0x0F0F0F0F;    <br />   5:     x = x + (x &gt;&gt; 8);    <br />   6:     x = x + (x &gt;&gt; 16);    <br />   7:     return x &amp; 0x0000003F;    <br />   8:  } <br /></font>   <br />这里用的是二分法，两两一组相加，之后四个四个一组相加，接着八个八个，最后就得到各位之和了。</p>
		<p>还有一个更巧妙的HAKMEM算法</p>
		<p>
				<font face="Courier New">   1:  int Count(unsigned x) {<br />   2:     unsigned n;    <br />   3:      <br />   4:     n = (x &gt;&gt; 1) &amp; 033333333333;    <br />   5:     x = x - n;   <br />   6:     n = (n &gt;&gt; 1) &amp; 033333333333;   <br />   7:     x = x - n;    <br />   8:     x = (x + (x &gt;&gt; 3)) &amp; 030707070707;   <br />   9:     x = modu(x, 63);  <br />   10:     return x;   <br />   11:  } <br /></font>   <br />首先是将二进制各位三个一组，求出每组中1的个数，然后相邻两组归并，得到六个一组的1的个数，最后很巧妙的用除63取余得到了结果。</p>
		<p>因为2^6 = 64，也就是说 x_0 + x_1 * 64 + x_2 * 64 * 64 = x_0 + x_1 + x_2 (mod 63)，这里的等号表示同余。</p>
		<p>这个程序只需要十条左右指令，而且不访存，速度很快。</p>
		<p>由此可见，衡量一个算法实际效果不单要看复杂度，还要结合其他情况具体分析。</p>
		<p>关于后面的两道扩展问题，问题一是问32位整型如何处理，这个上面已经讲了。</p>
		<p>问题二是给定两个整数A和B，问A和B有多少位是不同的。</p>
		<p>这个问题其实就是数1问题多了一个步骤，只要先算出A和B的异或结果，然后求这个值中1的个数就行了。<br /><br />总体看来这本书还是很不错的，比较喜欢里面针对一个问题提出不同算法并不断改进的风格。这里提出一点个人的理解，望大家指正 ;-)<br /></p>
		<p>(by ZelluX   <a href="/zellux">http://www.blogjava.net/zellux</a>)<br /></p>
<img src ="http://www.blogjava.net/zellux/aggbug/192955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-15 00:23 <a href="http://www.blogjava.net/zellux/archive/2008/04/15/192955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求n个32位无符号整数中异或后值最大的两个数</title><link>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 09 Apr 2008 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/191717.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/10/191717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/191717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/191717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题：<br>给定n个32位无符号整数，求出其中异或结果最大的两个整数。&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2008/04/10/191717.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/191717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-10 00:33 <a href="http://www.blogjava.net/zellux/archive/2008/04/10/191717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SICP 习题记录 (1)</title><link>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 03 Apr 2008 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/188018.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/04/03/188018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/188018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/188018.html</trackback:ping><description><![CDATA[没事干找了几个SICP上的习题做，先是一道以前只想出一种很啰嗦的写法的题目<br /><br />Ex 2.18<br />把一个列表倒过来。不习惯在lisp里用iterative方式 &gt;,&lt;<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_215109" onclick="this.style.display='none'; Code_Closed_Text_215109.style.display='none'; Code_Open_Image_215109.style.display='inline'; Code_Open_Text_215109.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_215109" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_215109.style.display='none'; Code_Closed_Image_215109.style.display='inline'; Code_Closed_Text_215109.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_215109" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_215109" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (reverse items)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (define (reverse-iter i k)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    (if (null? i)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        k<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (reverse-iter (cdr i)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                      (cons (car i) k))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (reverse-iter items ()))</span></span></div><br />接下来几题都是Map-Reduce思想的应用（或者照书上的说法，用enumerator - filter - map - accumulator这四个步骤操作一个list）<br /><br />用到的几个函数：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_214237" onclick="this.style.display='none'; Code_Closed_Text_214237.style.display='none'; Code_Open_Image_214237.style.display='inline'; Code_Open_Text_214237.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214237" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214237.style.display='none'; Code_Closed_Image_214237.style.display='inline'; Code_Closed_Text_214237.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214237" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214237" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (filter predicate sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (cond ((null? sequence) null)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        ((predicate (car sequence))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         (cons (car sequence) <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />               (filter predicate (cdr sequence))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (else (filter predicate (cdr sequence)))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (accumulate op initial sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (null? sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      initial<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (op (car sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          (accumulate op initial (cdr sequence)))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (enumerate-interval low high)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (&gt; low high)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      null<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (cons low (enumerate-interval (+ low </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) high))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(define (enumerate-tree tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (cond ((null? tree) null)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        ((pair? tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         (append (enumerate-tree (car tree))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                 (enumerate-tree (cdr tree))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        (else (list tree))))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div><br />enumrate-tree 的功能是遍历一个树状结构，把其中的所有叶子保存在一个list中。<br /><br />Ex 2.34<br />利用Horner's rule计算多项式结果（这公式这几天还经常碰到）<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_214514" onclick="this.style.display='none'; Code_Closed_Text_214514.style.display='none'; Code_Open_Image_214514.style.display='inline'; Code_Open_Text_214514.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214514" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214514.style.display='none'; Code_Closed_Image_214514.style.display='inline'; Code_Closed_Text_214514.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214514" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214514" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (hornel-eval x coefficient-sequence)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate (lambda (this-coeff higher-terms)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                (+ this-coeff (* x higher-terms)))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              coefficient-sequence))</span></span></div><p>Ex 2.35<br />数出一棵树中的叶子数。这题我的做法比较土，没想到map-reduce操作上的递归，而是把叶子节点的值都改成1然后一个累加。</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_214823" onclick="this.style.display='none'; Code_Closed_Text_214823.style.display='none'; Code_Open_Image_214823.style.display='inline'; Code_Open_Text_214823.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214823" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214823.style.display='none'; Code_Closed_Image_214823.style.display='inline'; Code_Closed_Text_214823.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214823" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214823" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (count-leave tree)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate +<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />              (map (lambda (x) </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                   (enumerate-tree tree))))</span></span></div><p>其实只要递归调用主函数就行了</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_214939" onclick="this.style.display='none'; Code_Closed_Text_214939.style.display='none'; Code_Open_Image_214939.style.display='inline'; Code_Open_Text_214939.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_214939" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214939.style.display='none'; Code_Closed_Image_214939.style.display='inline'; Code_Closed_Text_214939.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_214939" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_214939" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (count-leaves t)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (accumulate + </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> (map (lambda (x) (if (pair? x) (count-leaves x) </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)) t)))</span></span></div><p>Ex 2.36<br />可以理解为计算矩阵各列之和吧</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Code_Closed_Image_233258" onclick="this.style.display='none'; Code_Closed_Text_233258.style.display='none'; Code_Open_Image_233258.style.display='inline'; Code_Open_Text_233258.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_233258" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_233258.style.display='none'; Code_Closed_Image_233258.style.display='inline'; Code_Closed_Text_233258.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_233258" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Code_Open_Text_233258" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">(define (accumulate-n op init seqs)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  (if (null? (car seqs))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      null<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      (cons (accumulate op init (map car seqs))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            (accumulate-n op init (map cdr seqs)))))</span></span></div><br />&gt; (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 8 9) (list 10 11 12)))<br />(22 26 30)<img src ="http://www.blogjava.net/zellux/aggbug/188018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-04-03 22:33 <a href="http://www.blogjava.net/zellux/archive/2008/04/03/188018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的复杂度</title><link>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 26 Mar 2008 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/188904.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/03/27/188904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/188904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/188904.html</trackback:ping><description><![CDATA[
		<p>其实理解了 Regular Expression -&gt; NFA -&gt; DFA 这个过程，大致的复杂度确定也不难<br /><br />发信人: styc (styc), 信区: Algorithm<br />标  题: Re: 请问一下大家正则表达式的时间复杂度<br />发信站: 水木社区 (Wed Mar 26 20:37:02 2008), 站内</p>
		<p>NFA构造O(n)，匹配O(nm)<br />DFA构造O(2^n)，最小化O(kn'logn')（N'=O(2^n)），匹配O(m)<br />n=regex长度，m=串长，k=字母表大小，n'=原始的dfa大小<br />大概是这样子吧<br /></p>
<img src ="http://www.blogjava.net/zellux/aggbug/188904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-03-27 00:21 <a href="http://www.blogjava.net/zellux/archive/2008/03/27/188904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Minesweeper is NP-complete</title><link>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 06 Feb 2008 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/179406.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2008/02/06/179406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/179406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/179406.html</trackback:ping><description><![CDATA[http://web.mat.bham.ac.uk/R.W.Kaye/minesw/ordmsw.htm<br />
<br />
居然是NPC...
<img src ="http://www.blogjava.net/zellux/aggbug/179406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2008-02-06 19:40 <a href="http://www.blogjava.net/zellux/archive/2008/02/06/179406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tom Duff on Duff's Device</title><link>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Thu, 29 Nov 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/164015.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/29/164015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/164015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/164015.html</trackback:ping><description><![CDATA[Subject: Re: Explanation, please!<br />
Summary: Original citation<br />
From: <a href="http://www.lysator.liu.se/c/td/index.html" name="td">td@alice.UUCP (Tom Duff)</a><br />
Organization: AT&amp;T Bell Laboratories, Murray Hill NJ<br />
Date: 29 Aug 88 20:33:51 GMT<br />
Message-ID: &lt;8144@alice.UUCP&gt;<br />
<p>I normally do not read comp.lang.c, but Jim McKie told me that ``<a href="http://www.lysator.liu.se/c/duffs-device.html#duffs-device">Duff's device</a>'' had come up in comp.lang.c again.&nbsp;<tt> </tt>I have lost the version that was sent to netnews in May 1984, but I have reproduced below the note in which I originally proposed the device.&nbsp;<tt> </tt>(If anybody has a copy of the netnews version, I would gratefully receive a copy at research!td or td@research.att.com.)
<p>To clear up a few points:<br />
<ol>
    <li>The point of the device is to express general loop unrolling directly in C.&nbsp;<tt> </tt>People who have posted saying `just use memcpy' have missed the point, as have those who have criticized it using various machine-dependent memcpy implementations as support.&nbsp;<tt> </tt>In fact, the example in the message is not implementable as memcpy, nor is any computer likely to have an memcpy-like idiom that implements it.
    <p>&nbsp;</p>
    <li>Somebody claimed that while the device was named for me, I probably didn't invent it.&nbsp;<tt> </tt>I almost certainly did invent it.&nbsp;<tt> </tt>I had definitely not seen or heard of it when I came upon it, and nobody has ever even claimed prior knowledge, let alone provided dates and times.&nbsp;<tt> </tt>Note the headers on the message below:&nbsp;<tt> </tt>apparently I invented the device on November 9, 1983, and was proud (or disgusted) enough to send mail to <a href="http://www.cs.bell-labs.com/who/dmr/index.html">dmr</a>.&nbsp;<tt> </tt>Please note that I do not claim to have invented loop unrolling, merely this particular expression of it in C.
    <p>&nbsp;</p>
    <li>The device is legal dpANS C.&nbsp;<tt> </tt>I cannot quote chapter and verse, but <a href="http://www.lysator.liu.se/c/lr/index.html" name="lr">Larry Rosler</a>, who was chairman of the language subcommittee (I think), has assured me that X3J11 considered it carefully and decided that it was legal. Somewhere I have a note from <a href="http://www.cs.bell-labs.com/who/dmr/index.html">dmr</a> certifying that all the compilers that he believes in accept it.&nbsp;<tt> </tt>Of course, the device is also legal C++, since Bjarne uses it in his book.
    <p>&nbsp;</p>
    <li>Somebody invoked (or more properly, banished) the `false god of efficiency.'&nbsp;<tt> </tt>Careful reading of my original note will put this slur to rest.&nbsp;<tt> </tt>The alternative to genuflecting before the god of code-bumming is finding a better algorithm.&nbsp;<tt> </tt>It should be clear that none such was available.&nbsp;<tt> </tt>If your code is too slow, you must make it faster.&nbsp;<tt> </tt>If no better algorithm is available, you must trim cycles.
    <p>&nbsp;</p>
    <li>The same person claimed that the device wouldn't exhibit the desired speed-up.&nbsp;<tt> </tt>The argument was flawed in two regards:&nbsp;<tt> </tt>first, it didn't address the performance of the device, but rather the performance of one of its few uses (implementing memcpy) for which many machines have a high-performance idiom.&nbsp;<tt> </tt>Second, the poster made his claims in the absence of timing data, which renders his assertion suspect.&nbsp;<tt> </tt>A second poster tried the test, but botched the implementation, proving only that with diligence it is possible to make anything run slowly.
    <p>&nbsp;</p>
    <li>Even <a href="http://www.lysator.liu.se/c/henry/" name="henry">Henry Spencer</a>, who hit every other nail square on the end with the flat round thing stuck to it, made a mistake (albeit a trivial one).&nbsp;<tt> </tt>Here is Henry replying to bill@proxftl.UUCP (T. William Wells):<br />
    <pre>   &gt;&gt;... Dollars to doughnuts this
    &gt;&gt;was written on a RISC machine.
    &gt;Nope.&nbsp;<tt> </tt>Bell Labs Research uses VAXen and 68Ks, mostly.
    </pre>
    <p>I was at Lucasfilm when I invented the device.
    <p>&nbsp;</p>
    <li>Transformations like this can only be justified by measuring the resulting code.&nbsp;<tt> </tt>Be careful when you use this thing that you don't unwind the loop so much that you overflow your machine's instruction cache.&nbsp;<tt> </tt>Don't try to be smarter than an over-clever C compiler that recognizes loops that implement block move or block clear and compiles them into machine idioms. </li>
</ol>
<p>Here then, is the original document describing Duff's device:
<p>From research!ucbvax!dagobah!td&nbsp;<tt> </tt>Sun Nov 13 07:35:46 1983<br />
Received: by ucbvax.ARPA (4.16/4.13)&nbsp;<tt> </tt>id AA18997; Sun, 13 Nov 83 07:35:46 pst<br />
Received: by dagobah.LFL (4.6/4.6b)&nbsp;<tt> </tt>id AA01034; Thu, 10 Nov 83 17:57:56 PST<br />
Date: Thu, 10 Nov 83 17:57:56 PST<br />
From: <a href="http://www.lysator.liu.se/c/td/">ucbvax!dagobah!td (Tom Duff)</a><br />
Message-Id: &lt;8311110157.AA01034@dagobah.LFL&gt;<br />
To: <a href="http://www.lysator.liu.se/c/rrg/index.html" name="rrg">ucbvax!decvax!hcr!rrg</a>, <a href="http://www.lysator.liu.se/c/rrg/">ucbvax!ihnp4!hcr!rrg</a>, <a href="http://www.cs.bell-labs.com/who/dmr/index.html" name="dmr">ucbvax!research!dmr</a>, <a href="http://www.lysator.liu.se/c/rob/index.html" name="rob">ucbvax!research!rob</a><br />
<p>Consider the following routine, abstracted from code which copies an array of shorts into the Programmed IO data register of an Evans &amp; Sutherland Picture System II:
<p>
<pre>&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">send(to,&nbsp;from,&nbsp;count)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />register&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />register&nbsp;count;<br />
<img id="Codehighlighter1_65_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_120_Open_Text.style.display='none'; Codehighlighter1_65_120_Closed_Image.style.display='inline'; Codehighlighter1_65_120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_65_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_65_120_Closed_Text.style.display='none'; Codehighlighter1_65_120_Open_Image.style.display='inline'; Codehighlighter1_65_120_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_65_120_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_65_120_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">--</span><span style="color: #000000">count</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<p>(Obviously, this fails if the count is zero.)<br />
The VAX C compiler compiles the loop into 2 instructions (a movw and a sobleq,<br />
I think.)&nbsp;<tt> </tt>As it turns out, this loop was the bottleneck in a real-time animation playback program which ran too slowly by about 50%.&nbsp;<tt> </tt>The standard way to get more speed out of something like this is to unwind the loop a few times, decreasing the number of sobleqs.&nbsp;<tt> </tt>When you do that, you wind up with a leftover partial loop.&nbsp;<tt> </tt>I usually handle this in C with a switch that indexes a list of copies of the original loop body.&nbsp;<tt> </tt>Of course, if I were writing assembly language code, I'd just jump into the middle of the unwound loop to deal with the leftovers.&nbsp;<tt> </tt>Thinking about this <a name="duffs-device">yesterday, the following implementation occurred to me:</a>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">send(to,&nbsp;from,&nbsp;count)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;count;<br />
<img id="Codehighlighter1_73_415_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_415_Open_Text.style.display='none'; Codehighlighter1_73_415_Closed_Image.style.display='inline'; Codehighlighter1_73_415_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_415_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_415_Closed_Text.style.display='none'; Codehighlighter1_73_415_Open_Image.style.display='inline'; Codehighlighter1_73_415_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_73_415_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_415_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">(count</span><span style="color: #000000">+</span><span style="color: #000000">7</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">8</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_123_413_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_413_Open_Text.style.display='none'; Codehighlighter1_123_413_Closed_Image.style.display='inline'; Codehighlighter1_123_413_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_413_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_413_Closed_Text.style.display='none'; Codehighlighter1_123_413_Open_Image.style.display='inline'; Codehighlighter1_123_413_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">(count</span><span style="color: #000000">%</span><span style="color: #000000">8</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_123_413_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_123_413_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_144_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_393_Open_Text.style.display='none'; Codehighlighter1_144_393_Closed_Image.style.display='inline'; Codehighlighter1_144_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_144_393_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_144_393_Closed_Text.style.display='none'; Codehighlighter1_144_393_Open_Image.style.display='inline'; Codehighlighter1_144_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_144_393_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_144_393_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">to&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">from</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">--</span><span style="color: #000000">n</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
Disgusting, no?&nbsp;<tt> </tt>But it compiles and runs just fine.&nbsp;<tt> </tt>I feel a combination of pride and revulsion at this discovery.&nbsp;<tt> </tt>If no one's thought of it before, I think I'll name it after myself.
<p>It amazes me that after 10 years of writing C there are still little corners that I haven't explored fully.&nbsp;<tt> </tt>(Actually, I have another revolting way to use switches to implement interrupt driven state machines but it's too horrid to go into.)
<p>Many people (even <a href="http://www.lysator.liu.se/c/bwk/index.html" name="bwk">bwk</a>?) have said that the worst feature of C is that switches don't break automatically before each case label.&nbsp;<tt> </tt>This code forms some sort of argument in that debate, but I'm not sure whether it's for or against.
<p>yrs trly<br />
<a href="http://www.lysator.liu.se/c/td/index.html">Tom</a><br />
</p>
<img src ="http://www.blogjava.net/zellux/aggbug/164015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-29 16:02 <a href="http://www.blogjava.net/zellux/archive/2007/11/29/164015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>In-place Matrix Transposition</title><link>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 12 Nov 2007 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/159996.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/12/159996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/159996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/159996.html</trackback:ping><description><![CDATA[O(1)空间求矩阵转置的算法，貌似是分解成几个循环群，分别处理。<br />
from wikipedia<br />
<br />
<a href="http://www.blogjava.net/Files/zellux/In-place_matrix_transposition.zip">http://www.blogjava.net/Files/zellux/In-place_matrix_transposition.zip</a><br />
<img src ="http://www.blogjava.net/zellux/aggbug/159996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-12 16:16 <a href="http://www.blogjava.net/zellux/archive/2007/11/12/159996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>后缀树的在线生成算法</title><link>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 07 Nov 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/158935.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/07/158935.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/158935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/158935.html</trackback:ping><description><![CDATA[第一次接触后缀树应该是在某次省队集训，徐串大牛做的讲座。<br />
不过当时只是有了个印象。<br />
现在发现这东东还是很好用的&nbsp; @,@<br />
<br />
<a href="http://www.blogjava.net/Files/zellux/SuffixT1withFigs.rar">http://www.blogjava.net/Files/zellux/SuffixT1withFigs.rar</a> <br />
<br />
On&#8211;line construction of suffix trees<br />
by Esko Ukkonen<br />
<br />
<strong>Key Words</strong>.<br />
Linear time algorithm, suffix tree, suffix trie, suffix automaton, DAWG.<br />
<br />
<strong>Abstract</strong>.<br />
An on&#8211;line algorithm is presented for constructing the suffix tree for a given string in time linear in the length of the string. The new algorithm has the desirable property of processing the string symbol by symbol from left to right. It has always the suffix tree for the scanned part of the string ready. The method is developed as a linear&#8211;time version of a very simple algorithm for (quadratic size) suffix tries. Regardless of its quadratic worst-case this latter algorithm can be a good practical method when the string is not too long. Another variation of this method is shown to give in a natural way the well&#8211;known algorithms for constructing suffix automata (DAWGs).<br />
<br />
<img src ="http://www.blogjava.net/zellux/aggbug/158935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-07 21:08 <a href="http://www.blogjava.net/zellux/archive/2007/11/07/158935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线索二叉树</title><link>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 07 Nov 2007 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/158758.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/11/07/158758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/158758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/158758.html</trackback:ping><description><![CDATA[发现居然还是Pascal描述，亲切啊亲切<br />
<br />
http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/chapter5_4.htm<br />
<br />
<h2>线索二叉树</h2>
<p>当<a href="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/chapter5_3.htm">用二叉链表作为二叉树的存储结构</a>时，因为每个结点中只有指向其左、右儿子结点的指针，所以从任一结点出发只能直接找到该结点的左、右儿子。在一般情况下靠它无法直接找到该结点在某种遍历序下的前驱和后继结点。如果在每个结点中增加指向其前驱和后继结点的指针，将降低存储空间的效率。</p>
<p>我们可以证明：在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有个指针，除了根结点，每个结点都有一个从父结点指向该结点的指针，因此一共使用了n-1个指针，所以在n个结点的二叉链表中含有n+1个空指针。</p>
<p>因此可以利用这些空指针，存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为<font face="楷体_GB2312">线索</font>，加上了线索的二叉链表称为<font face="楷体_GB2312">线索链表</font>，相应的二叉树称为<font face="楷体_GB2312">线索二叉树</font>。为了区分一个结点的指针是指向其儿子的指针，还是指向其前驱或后继结点的线索，可在每个结点中增加两个线索标志。这样，线索二叉树结点类型定义为：</p>
<div align="center">
<center>
<table cellpadding="5" width="90%" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td width="100%">
            <p style="margin-top: 5px; margin-bottom: 5px">type</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;TPosition=^thrNodeType;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;thrNodeType=record</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Label:LabelType;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltag,rtag:0..1;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LeftChild,RightChild:TPosition;</p>
            <p style="margin-top: 5px; margin-bottom: 5px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; </p>
            </td>
        </tr>
    </tbody>
</table>
</center></div>
<p>其中ltag为左线索标志，rtag为右线索标志。它们的含义是:</p>
<ul>
    <li>ltag=0，LeftChild是指向结点左儿子的指针；
    <li>ltag=1，LeftChild是指向结点前驱的左线索。<br />
    <li>rtag=0，RightChild是指向结点右儿子的指针；
    <li>rtag=1，RihgtChild是指向结点后继的右线索。 </li>
</ul>
<p>例如图13(a)是一棵中序线索二叉树，它的线索链表如图13(b)所示。</p>
<blockquote>
<p align="center"><img height="218" src="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/images/img3.gif" width="263" border="0"  alt="" /></p>
<p align="center">(a)</p>
<p align="center"><img height="372" src="http://iprai.hust.edu.cn/icl2002/algorithm/datastructure/basic/binary_tree/images/img4.gif" width="523" border="0"  alt="" /></p>
<p align="center">(b)</p>
<p align="center">图13 线索二叉树及其线索链表</p>
</blockquote>
<p>图13(b)中，在二叉树的线索链表上增加了一个头结点，其LeftChild指针指向二叉树的根结点，其RightChild指针指向中序遍历时的最后一个结点。另外，二叉树中依中序列表的第一个结点的LeftChild指针，和最后一个结点的RightChild指针都指向头结点。这就像为二叉树建立了一个双向线索链表，既可从第一个结点起，顺着后继进行遍历，也可从最后一个结点起顺着前驱进行遍历。</p>
<p>如何在线索二叉树中找结点的前驱和后继结点？以图13的中序线索二叉树为例。树中所有叶结点的右链是线索，因此叶结点的RightChild指向该结点的后继结点，如图13中结点"b"的后继为结点"*"。当一个内部结点右线索标志为0时，其RightChild指针指向其右儿子，因此无法由RightChild得到其后继结点。然而，由中序遍历的定义可知，该结点的后继应是遍历其右子树时访问的第一个结点，即右子树中最左下的结点。例如在找结点"*"的后继时，首先沿右指针找到其右子树的根结点"-"，然后沿其LeftChild指针往下直至其左线索标志为1的结点，即为其后继结点(在图中是结点"c")。类似地，在中序线索树中找结点的前驱结点的规律是：若该结点的左线索标志为1，则LeftChild为线索，直接指向其前驱结点，否则遍历左子树时最后访问的那个结点，即左子树中最右下的结点为其前驱结点。由此可知，若线索二叉树的高度为h，则在最坏情况下，可在<em>O</em>(h)时间内找到一个结点的前驱或后继结点。在对中序线索二叉树进行遍历时，无须像非线索树的遍历那样，利用递归引入栈来保存待访问的子树信息。</p>
<p>对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为<font face="楷体_GB2312">二叉树的线索化</font>。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索，而一个结点的前驱或后继结点的信息只有在遍历时才能得到，因此线索化的过程即为在遍历过程中修改空指针的过程。为了记下遍历过程中访问结点的先后次序，可附设一个指针pre始终指向刚刚访问过的结点。当指针p指向当前访问的结点时，pre指向它的前驱。由此也可推知pre所指结点的后继为p所指的当前结点。这样就可在遍历过程中将二叉树线索化。对于找前驱和后继结点这二种运算而言，线索树优于非线索树。但线索树也有其缺点。在进行插人和删除操作时，线索树比非线索树的时间开销大。原因在于在线索树中进行插人和删除时，除了修改相应的指针外，还要修改相应的线索。</p>
<!-- #EndEditable --><script src="../../../lib/footer.js">
</script>
<img src ="http://www.blogjava.net/zellux/aggbug/158758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-11-07 11:02 <a href="http://www.blogjava.net/zellux/archive/2007/11/07/158758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取石子游戏</title><link>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 31 Oct 2007 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/157272.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/31/157272.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/157272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/157272.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 问题：<br>有两堆石子，数量任意，可以不同。游戏开始由两个人轮流取石子。游戏规定，每次有两种不同的取法，一是可以在任意的一堆中取走任意多的石子；二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目，如果轮到你先取，假设双方都采取最好的策略，问最后你是胜者还是败者。&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/31/157272.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/157272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-31 18:11 <a href="http://www.blogjava.net/zellux/archive/2007/10/31/157272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持O(1)时间push pop min方法的栈</title><link>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Mon, 29 Oct 2007 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/156777.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/29/156777.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/156777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/156777.html</trackback:ping><description><![CDATA[<p>算法课的习题<br />
题目很简单，但是代码很漂亮<br />
<br />
[zz]</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_38_350_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_350_Open_Text.style.display='none'; Codehighlighter1_38_350_Closed_Image.style.display='inline'; Codehighlighter1_38_350_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_350_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_350_Closed_Text.style.display='none'; Codehighlighter1_38_350_Open_Image.style.display='inline'; Codehighlighter1_38_350_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;min_stack&nbsp;</span><span id="Codehighlighter1_38_350_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_350_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />
<img id="Codehighlighter1_72_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_150_Open_Text.style.display='none'; Codehighlighter1_72_150_Closed_Image.style.display='inline'; Codehighlighter1_72_150_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_72_150_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_72_150_Closed_Text.style.display='none'; Codehighlighter1_72_150_Open_Image.style.display='inline'; Codehighlighter1_72_150_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;push(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;v)&nbsp;</span><span id="Codehighlighter1_72_150_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_72_150_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;s.push(make_pair(v,&nbsp;empty()</span><span style="color: #000000">||</span><span style="color: #000000">v</span><span style="color: #000000">&lt;</span><span style="color: #000000">s.top().second&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;v&nbsp;:&nbsp;s.top().second));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_166_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_177_Open_Text.style.display='none'; Codehighlighter1_166_177_Closed_Image.style.display='inline'; Codehighlighter1_166_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_166_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_177_Closed_Text.style.display='none'; Codehighlighter1_166_177_Open_Image.style.display='inline'; Codehighlighter1_166_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pop()&nbsp;</span><span id="Codehighlighter1_166_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_166_177_Open_Text"><span style="color: #000000">{&nbsp;s.pop();&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_197_221_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_221_Open_Text.style.display='none'; Codehighlighter1_197_221_Closed_Image.style.display='inline'; Codehighlighter1_197_221_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_197_221_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_221_Closed_Text.style.display='none'; Codehighlighter1_197_221_Open_Image.style.display='inline'; Codehighlighter1_197_221_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;top()&nbsp;</span><span id="Codehighlighter1_197_221_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_197_221_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.top().first;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_241_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_266_Open_Text.style.display='none'; Codehighlighter1_241_266_Closed_Image.style.display='inline'; Codehighlighter1_241_266_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_241_266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_241_266_Closed_Text.style.display='none'; Codehighlighter1_241_266_Open_Image.style.display='inline'; Codehighlighter1_241_266_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;min()&nbsp;</span><span id="Codehighlighter1_241_266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_241_266_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.top().second;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_284_304_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_304_Open_Text.style.display='none'; Codehighlighter1_284_304_Closed_Image.style.display='inline'; Codehighlighter1_284_304_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_284_304_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_304_Closed_Text.style.display='none'; Codehighlighter1_284_304_Open_Image.style.display='inline'; Codehighlighter1_284_304_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;empty()&nbsp;</span><span id="Codehighlighter1_284_304_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_304_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s.empty();&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;std::stack</span><span style="color: #000000">&lt;</span><span style="color: #000000">std::pair</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;s;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<img src ="http://www.blogjava.net/zellux/aggbug/156777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-29 21:30 <a href="http://www.blogjava.net/zellux/archive/2007/10/29/156777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道网易的笔试题</title><link>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 21 Oct 2007 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/154762.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/21/154762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/154762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/154762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 水木上看到的<br><br>一个K位的数N (K<=2000,N<=10^20)<br>找出一个比N大且最接近的数，这个数的每位之和与N相同<br>用代码实现之<br><br>如：<br>0050    所求数为0104<br>112     所求数为121<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/21/154762.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/154762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-21 22:05 <a href="http://www.blogjava.net/zellux/archive/2007/10/21/154762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摩根的算法题</title><link>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Sun, 21 Oct 2007 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/154777.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/21/154777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/154777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/154777.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 同样转自水木社区&nbsp;&nbsp;<a href='http://www.blogjava.net/zellux/archive/2007/10/21/154777.html'>阅读全文</a><img src ="http://www.blogjava.net/zellux/aggbug/154777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-21 22:05 <a href="http://www.blogjava.net/zellux/archive/2007/10/21/154777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU1065 - Wooden Sticks</title><link>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 17 Oct 2007 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/153717.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/17/153717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/153717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/153717.html</trackback:ping><description><![CDATA[睡前过一道，睡觉睡得香&nbsp;&nbsp;<img src="/CuteSoft_Client/CuteEditor/images/face5.gif" align="absMiddle" border="0"  alt="" />&nbsp; 不管这题多简单，咔咔<br />
<br />
按照木块的长度或质量排序，之后贪心即可，后面和NOIP的拦截导弹一样。
 <img src ="http://www.blogjava.net/zellux/aggbug/153717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zellux/" target="_blank">ZelluX</a> 2007-10-17 23:58 <a href="http://www.blogjava.net/zellux/archive/2007/10/17/153717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PKU1042 – Gone Fishing</title><link>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html</link><dc:creator>ZelluX</dc:creator><author>ZelluX</author><pubDate>Wed, 17 Oct 2007 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html</guid><wfw:comment>http://www.blogjava.net/zellux/comments/153630.html</wfw:comment><comments>http://www.blogjava.net/zellux/archive/2007/10/17/153630.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zellux/comments/commentRss/153630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zellux/services/trackbacks/153630.html</trackback:ping><description><![CDATA[<p>我的做法是枚举最远到达的湖，减去相应的时间后贪心。<br />
<br />
贪心时需要建立一个堆，用了STL中的priority_queue，然后就不知道如何设置less&lt;&gt;方法了。。。<br />
最后是通过自定义一个类node解决的<br />
<br />
一开始写的operator&lt;方法逻辑上有问题，VS 2005跑了一会儿就冒出个 Debug assert error，这个挺赞的<br />
<br />
导致我WA的几个数据：<br />
1) 收益为0的几组数据。由于一开始设置的max值为0，因此当正解也是0时并没有记录下当前的最优解。max初始为负值即可。<br />
2) 同样是0导致的问题。0收益的钓鱼点也可能出现在堆中，此时应该放弃这个点，把时间保留给序数大的钓鱼点。 </p>
<p>另外我有这次比赛的测试数据和标程，需要的朋友留言即可。</p>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fstream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">queue</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_108_368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_108_368_Open_Text.style.display='none'; Codehighlighter1_108_368_Closed_Image.style.display='inline'; Codehighlighter1_108_368_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_108_368_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_108_368_Closed_Text.style.display='none'; Codehighlighter1_108_368_Open_Image.style.display='inline'; Codehighlighter1_108_368_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;node&nbsp;</span><span id="Codehighlighter1_108_368_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_108_368_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;first,&nbsp;second;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;node(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y)<br />
<img id="Codehighlighter1_161_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_161_191_Open_Text.style.display='none'; Codehighlighter1_161_191_Closed_Image.style.display='inline'; Codehighlighter1_161_191_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_161_191_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_161_191_Closed_Text.style.display='none'; Codehighlighter1_161_191_Open_Image.style.display='inline'; Codehighlighter1_161_191_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_161_191_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_161_191_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;node&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">rhs)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br />
<img id="Codehighlighter1_235_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_366_Open_Text.style.display='none'; Codehighlighter1_235_366_Closed_Image.style.display='inline'; Codehighlighter1_235_366_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_235_366_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_366_Closed_Text.style.display='none'; Codehighlighter1_235_366_Open_Image.style.display='inline'; Codehighlighter1_235_366_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_366_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_235_366_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(second&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rhs.second)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(second&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;rhs.second)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(first&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;rhs.first);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />
<img id="Codehighlighter1_384_1855_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_1855_Open_Text.style.display='none'; Codehighlighter1_384_1855_Closed_Image.style.display='inline'; Codehighlighter1_384_1855_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_384_1855_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_384_1855_Closed_Text.style.display='none'; Codehighlighter1_384_1855_Open_Image.style.display='inline'; Codehighlighter1_384_1855_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_384_1855_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_384_1855_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;h;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d[</span><span style="color: #000000">26</span><span style="color: #000000">],&nbsp;t[</span><span style="color: #000000">26</span><span style="color: #000000">],&nbsp;f[</span><span style="color: #000000">26</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;priority_queue</span><span style="color: #000000">&lt;</span><span style="color: #000000">node,&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">node</span><span style="color: #000000">&gt;</span><span style="color: #000000">,&nbsp;less</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">node</span><span style="color: #000000">&gt;</span><span style="color: #000000">::value_type</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;heap;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;best(</span><span style="color: #000000">26</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;n;<br />
<img id="Codehighlighter1_552_1839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_552_1839_Open_Text.style.display='none'; Codehighlighter1_552_1839_Closed_Image.style.display='inline'; Codehighlighter1_552_1839_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_552_1839_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_552_1839_Closed_Text.style.display='none'; Codehighlighter1_552_1839_Open_Image.style.display='inline'; Codehighlighter1_552_1839_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_552_1839_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_552_1839_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;h;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;f[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;d[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;t[i];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best.clear();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;i&nbsp;indicates&nbsp;the&nbsp;last&nbsp;lake</span><span style="color: #008000"><br />
<img id="Codehighlighter1_893_1649_Open_Image" onclick="this.style.display='none'; Codehighlighter1_893_1649_Open_Text.style.display='none'; Codehighlighter1_893_1649_Closed_Image.style.display='inline'; Codehighlighter1_893_1649_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_893_1649_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_893_1649_Closed_Text.style.display='none'; Codehighlighter1_893_1649_Open_Image.style.display='inline'; Codehighlighter1_893_1649_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;n;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_893_1649_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_893_1649_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tempBest(</span><span style="color: #000000">26</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;valueGet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;timeLeft&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeLeft&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;t[j&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">heap.empty())<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.pop();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;j&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.push(node(j,&nbsp;f[j]));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_1213_1526_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1213_1526_Open_Text.style.display='none'; Codehighlighter1_1213_1526_Closed_Image.style.display='inline'; Codehighlighter1_1213_1526_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1213_1526_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1213_1526_Closed_Text.style.display='none'; Codehighlighter1_1213_1526_Open_Image.style.display='inline'; Codehighlighter1_1213_1526_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((</span><span style="color: #000000">!</span><span style="color: #000000">heap.empty())&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">))&nbsp;</span><span id="Codehighlighter1_1213_1526_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1213_1526_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap.top().first;<br />
<img id="Codehighlighter1_1291_1394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1291_1394_Open_Text.style.display='none'; Codehighlighter1_1291_1394_Closed_Image.style.display='inline'; Codehighlighter1_1291_1394_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1291_1394_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1291_1394_Closed_Text.style.display='none'; Codehighlighter1_1291_1394_Open_Image.style.display='inline'; Codehighlighter1_1291_1394_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(heap.top().second&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1291_1394_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1291_1394_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeLeft</span><span style="color: #000000">--</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempBest[next]</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valueGet&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;heap.top().second;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;valueLeft&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;heap.top().second&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;d[next];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.pop();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(valueLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.push(node(next,&nbsp;valueLeft));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1551_1645_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1551_1645_Open_Text.style.display='none'; Codehighlighter1_1551_1645_Closed_Image.style.display='inline'; Codehighlighter1_1551_1645_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1551_1645_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1551_1645_Closed_Text.style.display='none'; Codehighlighter1_1551_1645_Open_Image.style.display='inline'; Codehighlighter1_1551_1645_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(valueGet&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;max)&nbsp;</span><span id="Codehighlighter1_1551_1645_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1551_1645_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;valueGet;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tempBest;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timeLeft&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;best[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;timeLeft;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="col