﻿<?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>C++博客-ZAKIR-文章分类-USACO</title><link>http://www.cppblog.com/ZAKIR/category/13914.html</link><description>￣=斗Code年华=￣</description><language>zh-cn</language><lastBuildDate>Wed, 26 May 2010 07:35:51 GMT</lastBuildDate><pubDate>Wed, 26 May 2010 07:35:51 GMT</pubDate><ttl>60</ttl><item><title>Section 2.3</title><link>http://www.cppblog.com/ZAKIR/articles/116380.html</link><dc:creator>ZAKIR</dc:creator><author>ZAKIR</author><pubDate>Wed, 26 May 2010 05:07:00 GMT</pubDate><guid>http://www.cppblog.com/ZAKIR/articles/116380.html</guid><wfw:comment>http://www.cppblog.com/ZAKIR/comments/116380.html</wfw:comment><comments>http://www.cppblog.com/ZAKIR/articles/116380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ZAKIR/comments/commentRss/116380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ZAKIR/services/trackbacks/116380.html</trackback:ping><description><![CDATA[&nbsp;
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这一节做得很郁闷，题目以动态规划为主，而本人的动规很弱，做的很勉强。。。</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Longest Prefix</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>给定一堆短字符串，和一条长字符串，求用短字符串组成的长字符串的最长前缀长度。</span></p>
<p><strong><span>分析：</span></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>看完题目首先想到的是</span><span>DFS</span><span>，写完提交上去后到第三组数据就超时了。。。看了别人的题解，原来要用动规，用</span><span>dp[i]</span><span>表示当前能拼到的最长前缀，然后在短字符里面寻找最长的能和长字符串继续匹配的，然后</span><span>i+1</span><span>！本来想第一次试试</span><span>Hash</span><span>，但写到一半觉得函数写得不够好，先记住了，有空了用</span><span>Hash</span><span>优化一遍。</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Cow Pedigrees</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>给定一颗树的节点数和度，问其能构成多少种不同的数。</span></p>
<p><strong><span>分析</span></strong><span>：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这题虽然明知道要用动规，但想了一下午都没想出状态转移方程来，囧</span><span>~</span><span>。看了网上的官方题解，一颗树显然要由一颗小树（根节点）构成，可以是左子树，也可以是右子树，分三种情况，左长，右长，左右同长。状态转移方程如下：</span></p>
<p><span>table[i][j] += smalltrees[i-2][k]*table[i-1][j-1-k];</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span>左子树深度小于</span><span>i-1</span><span>，右子树深度为</span><span>i-1</span></p>
<p><span>table[i][j] += table[i-1][k]*smalltrees[i-2][j-1-k];</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span>左子树深度为</span><span>i-1</span><span>，右子树深度小于</span><span>i-1</span></p>
<p><span>table[i][j] += table[i-1][k]*table[i-1][j-1-k];</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </span><span>左右子树深度都为</span><span>i-1</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Zero Sum</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>请考虑一个由</span><span>1</span><span>到</span><span>N</span><span>（</span><span>N=3, 4, 5 ... 9</span><span>）的数字组成的递增数列：</span><span>1 2 3 ... N</span><span>。现在请在数列中插入&#8220;</span><span>+</span><span>&#8221;表示加，或者&#8220;</span><span>-</span><span>&#8221;表示减，&#8220;</span><span> </span><span>&#8221;表示空白</span><span>(</span><span>例如</span><span>1-2 3</span><span>就等于</span><span>1-23)</span><span>，来将每一对数字组合在一起（请不在第一个数字前插入符号）。计算该表达式的结果并判断其值是否为</span><span>0</span><span>。请你写一个程序找出所有产生和为零的长度为</span><span>N</span><span>的数列。</span></p>
<p><strong><span>分析：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>这题在培训的时候讲过，创建一个字符串&#8220;</span><span>1 2 3 4 5 6 7 8 9 </span><span>&#8221;数字间隔着空格，然后在空格位置枚举写入&#8216;</span><span> </span><span>&#8217;，&#8216;</span><span>+</span><span>&#8217;，&#8216;</span><span>-</span><span>&#8217;递归（其实也就是简单的</span><span>DFS</span><span>）。把字符串转成数字运算，若结果为</span><span>0</span><span>则输出。</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Money Systems</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>给出一套钱币的面值，求组成某数</span><span>N</span><span>有多少种方案。</span></p>
<p><strong><span>分析：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>这是个简单的动规，用</span><span>dp[ i ] [ j ]</span><span>表示仅用前</span><span>i</span><span>种钱币拼成</span><span>j</span><span>的方案数，那么仅用前</span><span>i-1</span><span>种钱币拼成</span><span>j</span><span>的方案</span><span>dp[i-1][j]</span><span>也满足，如果用了一枚面值为</span><span>i</span><span>的钱币，则</span><span>dp[i][j]+=dp[i-1][j-v[i]]</span><span>其中</span><span>v[i]</span><span>为</span><span>i</span><span>的面值，同理，用了两枚</span><span>dp[i][j]+=dp[i-1][j-2*v[i]]</span><span>，一直到</span><span>j-k*v[i]&lt;=0</span><span>为止。</span></p>
<p><span>注意，当</span><span>j</span><span>可以被</span><span>v[i]</span><span>整除时，</span><span>dp[i][j]++;</span><span>初始化</span><span>dp[1][k*v[1]]=1,(k*v[i]&lt;=N)</span></p>
<p><span>状态转移方程为：</span></p>
<p align=center><strong><span>dp[i][j] =</span></strong><strong><span>∑</span></strong><strong><span>dp[i-1][j-k*v[i]];</span></strong><strong><span>（</span></strong><strong><span>k=1..j/v[i]</span></strong><strong><span>）</span></strong><strong></strong></p>
<p>&nbsp;</p>
<p align=center><strong><span>Controlling Companies</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>有些公司是其他公司的部分拥有者，因为他们获得了其他公司发行的股票的一部分。如果至少满足了以下三个条件之一，公司</span><span>A</span><span>就可以控制公司</span><span>B</span><span>了：</span><span> </span></p>
<p><span>1.</span><span>公司</span><span>A = </span><span>公司</span><span>B</span><span>。</span><span> </span></p>
<p><span>2.</span><span>公司</span><span>A</span><span>拥有大于</span><span>50%</span><span>的公司</span><span>B</span><span>的股票。</span><span> </span></p>
<p><span>3.</span><span>公司</span><span>A</span><span>控制</span><span>K(K &gt;= 1)</span><span>个公司，记为</span><span>C1, ..., CK</span><span>，每个公司</span><span>Ci</span><span>拥有</span><span>xi%</span><span>的公司</span><span>B</span><span>的股票，并且</span><span>x1+ .... + xK &gt; 50%</span><span>。</span><span> </span></p>
<p><span>给你一个表，每行包括三个数</span><span>(i,j,p)</span><span>；表明公司</span><span>i</span><span>享有公司</span><span>j</span><span>的</span><span>p%</span><span>的股票。计算所有的数对</span><span>(h,s)</span><span>，表明公司</span><span>h</span><span>控制公司</span><span>s</span><span>。至多有</span><span>100</span><span>个公司。</span><span> </span></p>
<p>&nbsp;</p>
<p><span>写一个程序读入三对数</span><span>(i,j,p)</span><span>，</span><span>i,j</span><span>和</span><span>p</span><span>是都在范围</span><span>(1..100)</span><span>的正整数，并且找出所有的数对</span><span>(h,s)</span><span>，使得公司</span><span>h</span><span>控制公司</span><span>s</span><span>。</span></p>
<p><strong><span>分析：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这题似乎很麻烦，当你控制了一家新公司后，新公司又有可能控制着另一家公司，构成一层接一层的迭代关系。。。刚开始用</span><span>DFS</span><span>的时候思路就比较混乱，结果只通过了前六个测试，而且效率很低，后来细细分析了一下，其实这有点类似图的结构，题目给出的表可以看做邻接矩阵。问题就转化为，以某点作为原点出发，如果原点到某点</span><span>s</span><span>的距离超过</span><span>50</span><span>，那么把</span><span>s</span><span>纳入原点所在集合</span><span>P</span><span>，找与</span><span>s</span><span>距离超过</span><span>50</span><span>的点，再次纳入</span><span>P</span><span>，不断更新原点到这些点的距离。最后列出所有到原点距离超过</span><span>50</span><span>的点。</span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #c0c0c0; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img id=Codehighlighter1_18_20_Open_Image onclick="this.style.display='none'; Codehighlighter1_18_20_Open_Text.style.display='none'; Codehighlighter1_18_20_Closed_Image.style.display='inline'; Codehighlighter1_18_20_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_18_20_Closed_Image onclick="this.style.display='none'; Codehighlighter1_18_20_Closed_Text.style.display='none'; Codehighlighter1_18_20_Open_Image.style.display='inline'; Codehighlighter1_18_20_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Own[</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_18_20_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_18_20_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;current[</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;visit[</span><span style="COLOR: #000000">101</span><span style="COLOR: #000000">],flag;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;N,MAX</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,MIN</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Search(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br><img id=Codehighlighter1_106_290_Open_Image onclick="this.style.display='none'; Codehighlighter1_106_290_Open_Text.style.display='none'; Codehighlighter1_106_290_Closed_Image.style.display='inline'; Codehighlighter1_106_290_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_106_290_Closed_Image onclick="this.style.display='none'; Codehighlighter1_106_290_Closed_Text.style.display='none'; Codehighlighter1_106_290_Open_Image.style.display='inline'; Codehighlighter1_106_290_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_106_290_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_106_290_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,j;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">MIN;j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">MAX;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_149_279_Open_Image onclick="this.style.display='none'; Codehighlighter1_149_279_Open_Text.style.display='none'; Codehighlighter1_149_279_Closed_Image.style.display='inline'; Codehighlighter1_149_279_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_149_279_Closed_Image onclick="this.style.display='none'; Codehighlighter1_149_279_Closed_Text.style.display='none'; Codehighlighter1_149_279_Open_Image.style.display='inline'; Codehighlighter1_149_279_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_149_279_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_149_279_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;current[j]</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">Own[n][j];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(current[j]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">&amp;&amp;!</span><span style="COLOR: #000000">visit[j])<br><img id=Codehighlighter1_221_271_Open_Image onclick="this.style.display='none'; Codehighlighter1_221_271_Open_Text.style.display='none'; Codehighlighter1_221_271_Closed_Image.style.display='inline'; Codehighlighter1_221_271_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_221_271_Closed_Image onclick="this.style.display='none'; Codehighlighter1_221_271_Closed_Text.style.display='none'; Codehighlighter1_221_271_Open_Image.style.display='inline'; Codehighlighter1_221_271_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_221_271_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_221_271_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;visit[j]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Search(j);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_304_852_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_852_Open_Text.style.display='none'; Codehighlighter1_304_852_Closed_Image.style.display='inline'; Codehighlighter1_304_852_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_304_852_Closed_Image onclick="this.style.display='none'; Codehighlighter1_304_852_Closed_Text.style.display='none'; Codehighlighter1_304_852_Open_Image.style.display='inline'; Codehighlighter1_304_852_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_304_852_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_304_852_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;memset(visit,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(visit));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;fin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">N;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">N,i,j,p;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_394_586_Open_Image onclick="this.style.display='none'; Codehighlighter1_394_586_Open_Text.style.display='none'; Codehighlighter1_394_586_Closed_Image.style.display='inline'; Codehighlighter1_394_586_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_394_586_Closed_Image onclick="this.style.display='none'; Codehighlighter1_394_586_Closed_Text.style.display='none'; Codehighlighter1_394_586_Open_Image.style.display='inline'; Codehighlighter1_394_586_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_394_586_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_394_586_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;fin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">p;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Own[i][j]</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">p;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">MAX)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MIN)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MIN</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MIN)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MIN</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">j;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">MAX)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">j;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">MIN;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">MAX;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_626_836_Open_Image onclick="this.style.display='none'; Codehighlighter1_626_836_Open_Text.style.display='none'; Codehighlighter1_626_836_Closed_Image.style.display='inline'; Codehighlighter1_626_836_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_626_836_Closed_Image onclick="this.style.display='none'; Codehighlighter1_626_836_Closed_Text.style.display='none'; Codehighlighter1_626_836_Open_Image.style.display='inline'; Codehighlighter1_626_836_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_626_836_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_626_836_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;memset(current,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(current));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(visit,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(visit));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Search(i);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">MIN;j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">MAX;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(current[j]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">i)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/ZAKIR/aggbug/116380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ZAKIR/" target="_blank">ZAKIR</a> 2010-05-26 13:07 <a href="http://www.cppblog.com/ZAKIR/articles/116380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Section 2.2</title><link>http://www.cppblog.com/ZAKIR/articles/116378.html</link><dc:creator>ZAKIR</dc:creator><author>ZAKIR</author><pubDate>Wed, 26 May 2010 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/ZAKIR/articles/116378.html</guid><wfw:comment>http://www.cppblog.com/ZAKIR/comments/116378.html</wfw:comment><comments>http://www.cppblog.com/ZAKIR/articles/116378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ZAKIR/comments/commentRss/116378.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ZAKIR/services/trackbacks/116378.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>这一节以模拟题为主，比较恶心。一道动态规划，一道枚举。</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Preface Numbering</span></strong></p>
<p><strong><span>问题描述</span></strong><strong><span>：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>先是介绍罗马数字书写（略），给出一个数字，求</span><span>1</span><span>到这个数字之间所有数字的罗马表示中共出现几个</span><span>I</span><span>，</span><span>V</span><span>，</span><span>X</span><span>，</span><span>L</span><span>，</span><span>C</span><span>，</span><span>D</span><span>，</span><span>M</span><span>。</span></p>
<p><strong><span>分析</span></strong><span>：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>最初的思路是一个个地模拟：观察后可以发现，</span><span>46</span><span>可以表示为</span><span>XLVI</span><span>，以数组</span><span>s[1&#8230;7]</span><span>表示</span><span>I&#8230;M</span><span>，则</span><span>47</span><span>为</span><span>2111000</span><span>，而</span><span>4</span><span>为</span><span>1100000</span><span>，</span><span>7</span><span>为</span><span>21000000</span><span>，总结可知</span><span>s[n][1]=s[n%10][1];s[n][2]=s[n%10][2];</span><span>（注意</span><span>n%10==9</span><span>的话，</span><span>s[n][3]+=s[9][3]</span><span>）。</span><span>2&lt;=i&lt;=7</span><span>时，</span><span> s[n][i]=s[n/10][i-2]</span><span>。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>其实完全可以分段统计，比如</span><span>234</span><span>，个位出现了</span><span>23</span><span>个</span><span>0~9</span><span>，</span><span>1</span><span>个</span><span>0~4</span><span>，十位出现了</span><span>20</span><span>个</span><span>0~9</span><span>，</span><span>1</span><span>个</span><span>0~3</span><span>，百位出现了</span><span>1</span><span>、</span><span>2</span><span>；</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Subset Sums</span></strong></p>
<p><strong><span>问题描述</span></strong><span>：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>对于从</span><span>1</span><span>到</span><span>N (1 &lt;= N &lt;= 39) </span><span>的连续整数集合，能划分成两个子集合，且保证每个集合的数字和是相等的。给出</span><span>N</span><span>，你的程序应该输出划分方案总数，如果不存在这样的划分方案，则输出</span><span>0</span><span>。</span></p>
<p><strong><span>分析</span></strong><span>：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>看完题目最先想到的是深搜，枚举所有可能，当其和等于总和一半的时候则记录。但提交后发现，当</span><span>N</span><span>为</span><span>31</span><span>，程序算了</span><span>7</span><span>、</span><span>8</span><span>秒才出答案。看来深搜是不行了，在网上看了别人的解法才知道要动态规划。其实应该算递推，令</span><span>ans[i][j]</span><span>表示前</span><span>i</span><span>个数里面和为</span><span>j</span><span>的方案数，则</span><span>ans[i][j]</span><span>可以等于前</span><span>i-1</span><span>个数字里面和为</span><span>j</span><span>的方案数（即不含数字</span><span>j</span><span>的方案），加上前</span><span>i-1</span><span>个数字里和为</span><span>j-i</span><span>的方案数（即最终含有数字</span><span>j</span><span>，</span><span>,ans[N][N*(N+1)/4]</span><span>即为最终解。状态转移方程为：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>ans[i][j]=ans[i-1][j]+ans[i-1][j-i];</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Runaround Numbers</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>寻找循环数</span><span>----</span><span>从最右的数字出发，走数字对应的步数，然后从所停的数字继续出发，再走刚才所停数字对应步数，直到回到出发点。</span></p>
<p><strong><span>分析：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>循环数有点类似约瑟夫环，直接模拟即可，从题目所给数字开始一个个枚举。注意：数字不含</span><span>0</span><span>；回到起始点前，每一位都必须停留过一次且必须只停一次。</span></p>
<p>&nbsp;</p>
<p align=center><strong><span>Party Lamps</span></strong></p>
<p><strong><span>问题描述：</span></strong><strong></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span>有四个按钮控制</span><span>N</span><span>盏灯，</span><span>10&lt;=N&lt;=100</span></p>
<p><span>按钮</span><span>1</span><span>：当按下此按钮，将改变所有的灯：本来亮着的灯就熄灭，本来是关着的灯被点亮。</span><span> </span></p>
<p><span>按钮</span><span>2</span><span>：当按下此按钮，将改变所有奇数号的灯。</span></p>
<p><span>按钮</span><span>3</span><span>：当按下此按钮，将改变所有偶数号的灯。</span></p>
<p><span>按钮</span><span>4</span><span>：当按下此按钮，将改变所有序号是</span><span>3*K+1(K&gt;=0)</span><span>的灯。例如：</span><span>1,4,7...</span></p>
<p><span>一个计时器记录按下按钮的次数</span><span>C</span><span>，现给出</span><span>C</span><span>，和某些灯的最终开关状态，求所有的灯最终可能的所有状态。</span></p>
<p><strong><span>分析</span></strong><span>：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>这题很久以前就见过了，觉得比较麻烦，就一直没动，现在不动不行了。在纸上分析后会发现，灯的状态是六个一组循环出现的，故只需得出前六个灯的状态，后面的灯的状态就可知了。每盏灯有开关两种状态，四个循环枚举即可。在网上看了一下别人的解法，用二进制表示状态是比较方便的，于是我决定第一次尝试位运算解题。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>由于异或运算符的特点：</span><span>0</span><span>和</span><span>1</span><span>异或</span><span>1</span><span>以后取反，异或</span><span>0</span><span>不变。第一种操作可以用</span><span>n^(111111)<sub>2</sub></span><span>实现，第二种操作用</span><span>n^(101010)<sub>2</sub></span><span>实现，第三种用</span><span>n^(10101)<sub>2</sub></span><span>实现，第四种用</span><span>n^(100100)<sub>2</sub></span><span>实现。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>对于状态的读取，我想不出什么好办法。只好这样了：</span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #c0c0c0; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ReadOn()<br><img id=Codehighlighter1_13_276_Open_Image onclick="this.style.display='none'; Codehighlighter1_13_276_Open_Text.style.display='none'; Codehighlighter1_13_276_Closed_Image.style.display='inline'; Codehighlighter1_13_276_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_13_276_Closed_Image onclick="this.style.display='none'; Codehighlighter1_13_276_Closed_Text.style.display='none'; Codehighlighter1_13_276_Open_Image.style.display='inline'; Codehighlighter1_13_276_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_13_276_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_13_276_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;tem[</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;memset(tem,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(tem));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,c;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(fin</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">!=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tem[(c</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">此处灯亮，则令其为1</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_176_237_Open_Image onclick="this.style.display='none'; Codehighlighter1_176_237_Open_Text.style.display='none'; Codehighlighter1_176_237_Closed_Image.style.display='inline'; Codehighlighter1_176_237_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_176_237_Closed_Image onclick="this.style.display='none'; Codehighlighter1_176_237_Closed_Text.style.display='none'; Codehighlighter1_176_237_Open_Image.style.display='inline'; Codehighlighter1_176_237_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_176_237_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_176_237_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(tem[i])<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;c;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c的二进制表示就是题目给出的部分灯亮的状态</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">例如，测试数据给出</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">号灯亮，则最终状态里</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">位上的必为</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">，表示为：</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>010000 </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">。读入不亮的灯的函数做相应修改即可。</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">判断当前枚举得到的状态是否满足要求可用以下方法：</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><o:p></o:p></span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #c0c0c0; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(a</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">d</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">times)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((state</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">Off)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">Off)<br><img id=Codehighlighter1_44_172_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_172_Open_Text.style.display='none'; Codehighlighter1_44_172_Closed_Image.style.display='inline'; Codehighlighter1_44_172_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_44_172_Closed_Image onclick="this.style.display='none'; Codehighlighter1_44_172_Closed_Text.style.display='none'; Codehighlighter1_44_172_Open_Image.style.display='inline'; Codehighlighter1_44_172_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_44_172_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_44_172_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((state</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">On)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">On)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Off表示测试数据给出的不亮的灯&nbsp;On表示亮的灯（即限制条件）</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[state]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(state</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">On</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[state]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">第五行如果</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>state</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">是</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">即都不亮，而</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>On</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">也为</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">，本来应该是符合的，但由于</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>0&amp;0=1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">！</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><font face=Calibri>=0.</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin; mso-bidi-font-size: 10.5pt">所以在后面补上。</span><span style="mso-bidi-font-size: 10.5pt" lang=EN-US><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/ZAKIR/aggbug/116378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ZAKIR/" target="_blank">ZAKIR</a> 2010-05-26 13:02 <a href="http://www.cppblog.com/ZAKIR/articles/116378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Section 2.1</title><link>http://www.cppblog.com/ZAKIR/articles/116377.html</link><dc:creator>ZAKIR</dc:creator><author>ZAKIR</author><pubDate>Wed, 26 May 2010 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/ZAKIR/articles/116377.html</guid><wfw:comment>http://www.cppblog.com/ZAKIR/comments/116377.html</wfw:comment><comments>http://www.cppblog.com/ZAKIR/articles/116377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ZAKIR/comments/commentRss/116377.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ZAKIR/services/trackbacks/116377.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;The Castle&nbsp;问题描述：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给定一张室内平面图，图上画着不同的房间，房间用墙间隔，（1）请计算图中房间的数目。（2）最大的房间的面积。（3）拆掉哪堵墙可使得到的房间最大。输出最大面积，和要拆的墙。初步分析：图的表示方式很诡异—每一格用四个整数的和表示其四周墙的情况：1: 在西面有墙，...&nbsp;&nbsp;<a href='http://www.cppblog.com/ZAKIR/articles/116377.html'>阅读全文</a><img src ="http://www.cppblog.com/ZAKIR/aggbug/116377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ZAKIR/" target="_blank">ZAKIR</a> 2010-05-26 12:54 <a href="http://www.cppblog.com/ZAKIR/articles/116377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>