﻿<?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++博客-SunKai's Blog-随笔分类-算法习题/题解</title><link>http://www.cppblog.com/sunkai/category/6309.html</link><description>I'm an OIer,I want to achieve my dream</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:10:21 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:10:21 GMT</pubDate><ttl>60</ttl><item><title>习题 46：Monkey And Banana ★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/04/04/46248.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 04 Apr 2008 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/04/04/46248.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/46248.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/04/04/46248.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/46248.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/46248.html</trackback:ping><description><![CDATA[<pre class="sh_cpp sh_sourceCode" id=code1 style="FONT-FAMILY: " onclick=""><span class=sh_preproc><span class=bold>习题 46：Monkey And Banana ★★★★</span><br><br>
<div class=t_msgfont id=message2141><font face="宋体 "><font size=3><font color=blue>问题描述：</font><br>有一班科学家正在设计一个测试猴子IQ的试验。他们 把一只&#8220;banana&#8221;吊在天花板，而且同时给猴子一些箱子。如果猴子聪明的话，它们会把箱子一个个叠起来做成一个塔子来取得食物。科学家有n种箱子，而且每一种箱子都有好多个。第 i 种箱子有三维（xi,yi,zi)。箱子可以用它的任意一面作底面来摆放，也就是它的三维之中可以任选两条来做它的底面长和宽。科学家想确定箱子叠到最高的时候是可以到达天花板的。现在问题是，要叠起一个塔子，上下摆放的两个箱子，在上的箱子的底面长宽必须严格小于在下的箱子的底面长宽,留下些地方让猴子落脚来爬上去。也就是说，底面面积相等的箱子不能叠放。现在你的任务是利用所给定的箱子，决定塔子最高能达到的高度<br><br><font color=blue>输入：</font><br>输入数据有多组测试数据。<br>每一组测试数据的第一行是一个整数n，表示不同三维的箱子的总数。n最大为30。<br>以下的n行每一行有三个正整数，表示该箱子的三维xi,yi和zi。<br>当n=0的时候输入结束。<br><br><font color=blue>输出：</font><br>对应每组测试数据，输出一行包括数据组号case（从1开始）和塔子最高高度height，<br>并按照一下格式： "Case case: maximum height = height" <br><br><font color=blue>样例输入</font><br>1<br>10 20 30<br>2<br>6 8 10<br>5 5 5<br>7<br>1 1 1<br>2 2 2<br>3 3 3<br>4 4 4<br>5 5 5<br>6 6 6<br>7 7 7<br>5<br>31 41 59<br>26 53 58<br>97 93 23<br>84 62 64<br>33 83 27<br>0<br><br><font color=blue>样例输出</font><br>Case 1: maximum height = 40<br>Case 2: maximum height = 21<br>Case 3: maximum height = 28<br>Case 4: maximum height = 342 <br><br><font color=red>难度：Difficult</font></font></font></div>
<br>#include</span><span class=sh_string>&lt;stdio.h&gt;</span>
<span class=sh_preproc>#include</span><span class=sh_string>&lt;string.h&gt;</span>
<span class=sh_keyword>typedef</span> <span class=sh_keyword>struct</span>
<span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_type>int</span> a,b,c;
<span class=sh_cbracket>}</span> data;
data x[<span class=sh_number>90</span>];
<span class=sh_type>int</span> d[<span class=sh_number>90</span>];
<span class=sh_type>int</span> n;
<span class=sh_type>int</span> <span class=sh_function>dfs</span>(<span class=sh_type>int</span> q)
<span class=sh_cbracket>{</span>
&nbsp; &nbsp; <span class=sh_type>int</span> i,best=<span class=sh_number>0</span>;
&nbsp; &nbsp; <span class=sh_keyword>if</span>(d[q]) <span class=sh_keyword>return</span> d[q];
&nbsp; &nbsp; <span class=sh_keyword>for</span>(i=<span class=sh_number>0</span>;i&lt;n;i++)
&nbsp; &nbsp; <span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_keyword>if</span>(x[i].a&lt;x[q].a &amp;&amp; x[i].b&lt;x[q].b)
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_keyword>if</span>(best&lt;<span class=sh_function>dfs</span>(i)) best=<span class=sh_function>dfs</span>(i);
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>}</span>
&nbsp; &nbsp; <span class=sh_cbracket>}</span>
&nbsp; &nbsp; d[q]=x[q].c+best;
&nbsp; &nbsp; <span class=sh_keyword>return</span> d[q];
<span class=sh_cbracket>}</span>
<span class=sh_type>int</span> <span class=sh_function>main</span>(<span class=sh_type>void</span>)
<span class=sh_cbracket>{</span>
&nbsp; &nbsp; <span class=sh_type>int</span> i,k=<span class=sh_number>1</span>,a,b,c;
&nbsp; &nbsp; <span class=sh_type>int</span> best;
&nbsp; &nbsp; <span class=sh_keyword>while</span>(<span class=sh_cbracket>scanf</span>(<span class=sh_string>"%d"</span>,&amp;n),n!=<span class=sh_number>0</span>)
&nbsp; &nbsp; <span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;n*=<span class=sh_number>3</span>;
&nbsp; &nbsp;&nbsp; &nbsp;best=<span class=sh_number>0</span>;
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_function>memset</span>(d,<span class=sh_number>0</span>,<span class=sh_keyword>sizeof</span>(d));
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_keyword>for</span>(i=<span class=sh_number>0</span>;i&lt;n;i++)
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_cbracket>scanf</span>(<span class=sh_string>"%d%d%d"</span>,&amp;a,&amp;b,&amp;c);
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;x[i].a=a; x[i].b=b; x[i].c=c;
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_keyword>if</span>(x[i].a&gt;x[i].b) x[i].a^=x[i].b^=x[i].a^=x[i].b;
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;i++; x[i].a=a; x[i].b=c; x[i].c=b;
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_keyword>if</span>(x[i].a&gt;x[i].b) x[i].a^=x[i].b^=x[i].a^=x[i].b;
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;i++; x[i].a=b; x[i].b=c; x[i].c=a;
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_keyword>if</span>(x[i].a&gt;x[i].b) x[i].a^=x[i].b^=x[i].a^=x[i].b;
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>}</span>
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_keyword>for</span>(i=<span class=sh_number>0</span>;i&lt;n;i++)
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>{</span>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span class=sh_keyword>if</span>(best&lt;<span class=sh_function>dfs</span>(i)) best=<span class=sh_function>dfs</span>(i);
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>}</span>
&nbsp; &nbsp;&nbsp; &nbsp;<span class=sh_cbracket>printf</span>(<span class=sh_string>"Case %d: maximum height = %d</span><span class=sh_specialchar>\n</span><span class=sh_string>"</span>,k++,best);
&nbsp; &nbsp; <span class=sh_cbracket>}</span>
&nbsp; &nbsp; <span class=sh_keyword>return</span> <span class=sh_number>0</span>;
<span class=sh_cbracket>}</span></pre>
<script>sh_highlightElement(document,code1);</script>
<img src ="http://www.cppblog.com/sunkai/aggbug/46248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-04-04 11:20 <a href="http://www.cppblog.com/sunkai/archive/2008/04/04/46248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整数分解问题</title><link>http://www.cppblog.com/sunkai/archive/2008/04/04/46246.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 04 Apr 2008 03:15:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/04/04/46246.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/46246.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/04/04/46246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/46246.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/46246.html</trackback:ping><description><![CDATA[<p>/*<br>问题描述：<br>大于1的正整数n可以分解为n=x1 * x2 * ... * xn<br>例如n=12时<br>12=12<br>12=6*2<br>12=4*3<br>12=3*4<br>12=3*2*2<br>12=2*6<br>12=2*3*2<br>12=2*2*3</p>
<p>1&lt;=n&lt;=2000000000<br>*/<br>/*<br>分析：<br>DP之记忆化搜索<br>状态若用d[2000000000]则内存不足<br>因此采用结构体记录状态<br>经过简单数学推理，对于一个数N,它的因子数不超过N^(1/2)+1<br>使用二分法查找<br>时间复杂度最终为O(N^1.5logN) <br>*/ <br>#include&lt;stdio.h&gt;<br>#include&lt;math.h&gt;<br>struct DP<br>{<br>&nbsp;&nbsp;&nbsp; int num;<br>&nbsp;&nbsp;&nbsp; int sum;<br>} d[50000]={0};<br>int max=0;<br>void qsort(int low,int high,struct DP key[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; int i=low,j=high;<br>&nbsp;&nbsp;&nbsp;&nbsp; struct DP tag=key[i];<br>&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(tag.num&lt;key[j].num &amp;&amp; i&lt;j) j--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[i]=key[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(tag.num&gt;=key[i].num &amp;&amp; i&lt;j) i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[j]=key[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }while(i&lt;j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[i]=tag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qsort(low,j-1,key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qsort(i+1,high,key);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>int dfs(int left)<br>{<br>&nbsp;&nbsp;&nbsp; int i,p;<br>&nbsp;&nbsp;&nbsp; int l,r,m;<br>&nbsp;&nbsp;&nbsp; int count=0;<br>&nbsp;&nbsp;&nbsp; l=0; r=max;<br>&nbsp;&nbsp;&nbsp; while(l&lt;=r)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m=(l+r)&gt;&gt;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(d[m].num&lt;left) l=m+1; else r=m-1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; p=l; if(d[p].sum) return d[p].sum;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=d[i].num;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(left%d[i].num==0) count+=dfs(left/d[i].num);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; d[p].sum=count;<br>&nbsp;&nbsp;&nbsp; return count;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,tmp;<br>&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n); tmp=sqrt(n);<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=tmp;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n%i==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[max].num=i; max++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[max].num=n/i; max++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } max--;<br>&nbsp;&nbsp;&nbsp; qsort(0,max,d);<br>&nbsp;&nbsp;&nbsp; d[0].sum=1;<br>&nbsp;&nbsp;&nbsp; printf("%d\n",dfs(n));<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/sunkai/aggbug/46246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-04-04 11:15 <a href="http://www.cppblog.com/sunkai/archive/2008/04/04/46246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题69：数素数★★</title><link>http://www.cppblog.com/sunkai/archive/2008/04/04/46245.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 04 Apr 2008 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/04/04/46245.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/46245.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/04/04/46245.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/46245.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/46245.html</trackback:ping><description><![CDATA[/*<br>&nbsp;
<div class=msgheader><font size=4><font color=red>习题69：数素数★★</div>
<div class=msgborder></font></font><font color=blue>题目描述：</font><font color=black><br>素数是的只能被1和它本身整除的自然数。<br>判断一个数是素数的方法是使用2到小于该数的数除它，<br>若有能整除的则该数不是素数。<br><br><font color=blue>输入：</font><br>多组测试数据，每组一行，每行是两个整数m,n(1&lt;= m,n &lt;=4000000)，<br>遇到EOF标志结束程序<br><br><font color=blue>输出：</font><br>输出一个整数，表示介于m,n之间（包括m,n）的素数的数量<br><br><font color=blue>样例输入：</font><br>5 10<br>1 3<br>6 8<br><br><font color=blue>样例输出：</font><br>2<br>2<br>1<br><br><font color=blue>提示：</font><br>虽然内存限制有64M大小，但也要节约空间~~<br><br></font><font color=red>难度：Easy<br></font></div>
<div class=msgborder><font color=#ff0000>*/</font><br>#include&lt;stdio.h&gt;<br>#include&lt;math.h&gt;<br>int S[2000]={<br>0,309,255,237,227,226,215,212,219,210,202,205,208,193,206,190,198,204,192,190,190,<br>207,183,180,193,188,193,184,198,189,176,184,179,192,172,189,186,184,184,175,185,<br>178,176,185,179,172,188,184,168,179,187,166,180,173,175,175,172,175,175,175,183,<br>175,171,179,172,174,164,188,164,184,164,163,179,176,175,177,168,170,165,173,164,<br>168,167,161,175,173,160,170,184,162,171,179,163,168,169,167,168,173,161,167,162,<br>168,175,179,156,168,157,171,168,167,167,163,173,173,157,161,152,169,168,168,168,<br>164,172,165,162,167,153,167,155,168,164,177,163,169,151,170,156,159,174,161,161,<br>147,173,161,153,161,151,167,162,176,164,153,158,164,160,170,173,164,161,166,166,<br>161,162,163,156,167,149,162,161,160,164,162,162,165,163,152,157,159,159,162,162,<br>146,148,159,171,151,160,154,163,161,151,168,172,163,149,160,154,150,151,152,165,<br>162,150,169,153,168,150,162,158,154,163,161,164,170,146,155,162,171,153,141,166,<br>157,143,162,149,148,150,161,153,171,160,153,163,165,157,159,156,142,152,166,159,<br>152,167,155,162,155,143,166,149,156,157,151,149,174,154,164,153,158,155,157,151,<br>153,155,155,148,156,152,148,157,158,151,160,154,144,168,150,143,151,155,163,156,<br>151,162,154,156,158,149,174,148,142,158,160,154,147,157,156,155,150,159,159,148,<br>160,160,148,152,153,143,144,147,160,157,154,136,152,146,161,151,154,152,153,160,<br>143,149,164,144,167,146,145,153,161,148,144,164,159,147,153,157,153,144,153,155,<br>155,144,152,156,157,164,151,154,139,159,138,150,157,164,150,153,145,154,156,148,<br>156,148,151,128,147,156,148,152,160,138,159,158,149,159,150,155,155,152,142,150,<br>151,161,146,152,154,147,155,158,147,157,156,142,145,152,142,160,146,150,153,138,<br>163,157,158,152,141,151,163,137,149,148,146,153,146,151,147,153,141,148,157,147,<br>155,151,156,152,156,148,136,161,142,159,149,148,153,152,138,155,150,148,152,140,<br>144,153,152,165,152,139,137,148,155,146,156,162,143,151,137,150,156,143,145,158,<br>146,145,142,146,152,144,148,135,145,158,154,150,144,143,164,143,148,143,134,146,<br>147,158,131,154,144,142,159,146,153,156,145,149,167,138,151,148,151,150,152,145,<br>153,145,152,129,159,147,147,135,155,150,143,145,149,140,146,144,149,141,132,158,<br>142,152,149,145,152,149,140,166,144,142,142,146,149,149,160,146,142,147,149,157,<br>146,154,153,151,145,153,127,156,139,140,148,153,150,154,150,136,144,144,143,144,<br>139,157,144,145,153,155,142,171,149,143,146,145,139,145,150,160,155,147,154,145,<br>151,144,153,140,146,143,142,145,134,139,135,156,157,141,155,141,141,142,155,138,<br>142,149,130,136,153,147,139,153,146,157,144,133,159,144,151,144,150,147,151,148,<br>151,149,132,141,150,141,147,147,158,146,134,144,140,148,143,147,147,141,142,151,<br>143,137,143,152,134,168,143,147,137,132,153,137,147,149,147,154,138,141,132,150,<br>142,148,144,144,148,147,139,144,152,140,138,151,157,151,147,129,153,142,139,140,<br>149,156,163,146,137,138,136,148,148,154,123,130,142,145,140,150,156,136,154,148,<br>159,141,149,143,139,142,152,141,139,149,160,135,140,152,147,148,128,147,141,147,<br>128,157,154,142,150,137,140,157,146,153,140,133,146,144,162,148,143,149,144,137,<br>147,142,138,142,148,134,143,133,137,147,146,143,147,131,142,149,147,137,146,148,<br>143,152,132,141,146,139,140,155,140,145,133,147,135,146,132,144,145,134,150,136,<br>142,144,160,149,143,134,152,127,146,135,151,144,140,146,154,143,142,156,147,131,<br>130,136,148,148,137,150,128,154,152,137,138,146,127,153,154,150,133,149,145,155,<br>142,133,137,142,135,146,146,137,147,154,152,131,141,143,144,140,136,145,137,150,<br>140,127,148,145,136,141,141,139,140,154,134,141,145,146,158,152,137,136,136,124,<br>134,144,143,147,143,130,154,136,155,145,146,139,143,126,151,145,148,132,156,141,<br>131,152,145,150,141,136,149,130,139,139,154,149,148,142,146,146,123,131,138,153,<br>143,138,150,130,145,156,145,147,140,145,150,144,141,142,136,139,146,138,153,133,<br>145,143,145,141,152,138,137,140,132,138,137,148,145,148,143,148,143,136,133,142,<br>154,148,140,142,139,135,145,150,142,141,150,131,139,140,154,131,135,150,135,140,<br>132,130,134,138,128,148,151,139,152,132,147,136,142,143,150,151,135,142,141,141,<br>156,139,137,156,137,142,140,147,127,145,147,138,155,140,138,132,138,151,133,137,<br>134,140,140,132,156,145,134,151,136,139,148,140,134,133,136,149,129,137,149,150,<br>132,145,131,139,139,149,140,141,149,138,140,135,146,144,136,131,143,139,144,155,<br>129,141,133,150,137,145,144,146,134,133,145,140,148,154,146,139,136,129,146,138,<br>146,132,148,142,133,128,148,138,145,140,140,140,140,123,140,137,143,147,142,143,<br>135,132,137,132,132,145,139,158,140,134,145,148,132,135,137,135,151,144,122,135,<br>146,154,147,146,127,151,142,145,146,151,147,128,144,132,122,137,144,136,143,140,<br>139,135,145,153,133,130,142,147,141,130,133,133,138,138,137,134,151,126,137,146,<br>141,137,140,140,136,126,145,141,131,144,131,150,135,146,148,137,142,130,149,120,<br>144,138,148,141,128,155,147,139,133,126,153,148,124,147,134,135,128,140,151,139,<br>146,134,152,123,145,139,131,134,143,135,130,151,130,146,137,143,136,158,131,134,<br>145,144,133,150,129,130,145,138,131,141,137,138,133,145,153,131,134,138,138,143,<br>132,150,140,141,136,134,146,139,131,133,141,138,160,140,133,151,140,135,126,147,<br>127,134,143,128,150,124,148,146,129,139,150,139,125,147,132,147,136,147,152,129,<br>157,142,132,142,139,133,138,144,139,137,133,136,130,135,141,141,143,148,134,126,<br>144,138,132,132,156,156,120,140,128,150,137,152,132,141,145,129,146,147,138,134,<br>139,143,133,122,137,136,148,127,145,133,139,139,143,147,134,144,138,139,143,127,<br>150,138,142,137,140,143,141,155,118,142,128,125,144,141,130,127,130,147,142,141,<br>132,144,126,143,131,135,138,141,147,135,141,142,128,139,145,130,137,137,136,147,<br>139,127,127,149,136,131,145,140,145,146,126,158,145,150,131,142,141,145,143,135,<br>116,143,141,154,139,151,135,133,141,121,153,139,133,138,127,140,132,140,134,150,<br>135,131,137,136,132,128,142,136,139,135,141,139,132,130,134,142,138,133,143,141,<br>144,126,140,134,135,151,132,142,140,126,139,135,130,146,147,135,119,141,131,136,<br>146,141,128,124,130,143,149,141,143,135,138,134,134,133,138,147,141,145,131,126,<br>139,143,135,149,133,132,154,128,139,133,154,131,127,138,130,134,133,142,142,129,<br>137,138,119,144,131,147,137,138,128,131,144,132,132,141,136,134,124,137,143,148,<br>138,145,140,139,141,129,143,144,146,138,138,140,121,124,135,147,138,144,137,128,<br>139,144,150,132,137,133,130,141,150,126,139,128,137,134,134,137,133,138,145,145,<br>135,147,127,122,139,149,138,132,150,138,130,137,120,148,148,131,139,143,139,139,<br>138,140,147,149,131,139,139,140,138,138,142,136,136,135,138,130,148,129,144,142,<br>143,139,131,129,133,144,130,136,133,134,137,145,139,130,146,136,134,129,136,146,<br>156,119,129,142,136,138,139,137,125,140,138,117,135,137,140,146,133,140,139,134,<br>130,131,133,152,133,142,128,132,127,139,136,152,131,130,138,138,129,134,128,124,<br>131,126,139,152,142,147,126,133,139,147,131,132,142,137,140,136,129,137,147,127,<br>136,148,137,131,143,147,137,134,138,126,140,133,137,143,128,143,144,135,145,140,<br>133,145,135,132,149,117,140,132,135,125,132,130,135,141,125,141,134,121,130,142,<br>121,128,133,129,141,140,135,124,145,118,151,141,120,132,149,136,135,122,139,133,<br>130,124,135,127,146,135,139,123,129,136,131,143,139,126,136,137,136,139,133,137,<br>141,135,141,141,125,125,136,134,137,135,132,152,129,123,134,144,142,133,143,133,<br>141,148,147,137,144,134,142,125,158,138,135,135,142,137,128,129,131,135,132,134,<br>135,126,121,127,132,152,131,125,142,141,126,144,137,140,140,152,144,123,130,135,<br>134,131,150,130,148,132,137,141,139,123,142,120,145,137,134,139,142,129,146,146,<br>140,141,140,127,142,132,123,140,124,132,144,147,140,126,139,135,114,123,136,139,<br>134,122,136,133,143,138,139,131,144,126,126,141,118,139,145,132,134,149,127,122,<br>156,127,145,143,138,137,146,136,119,144,139,127,132,137,132,148,131,135,134,143,<br>128,137,128,136,142,134,128,125,143,129,123,143,129,134,140,132,130,144,128,143,<br>147,142,135,134,127,127,133,138,142,143,126,133,130,143,126,136,144,140,141,138,<br>129,131,137,138,131,144,135,139,141,136,117,136,133,130,132,136,116,135,139,134,<br>144,139,142,124,131,123,136,129,120,149,130,119,139};<br>int m=0;<br>int n1,n2;<br>int i,k;<br>void sumx(int n1,int n2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; for(i=n1;i&lt;n2;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=2;k&lt;=sqrt(i);k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%k==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>int main(void)<br>{<br>&nbsp; while(scanf("%ld%ld",&amp;n1,&amp;n2)!=EOF)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; m=0;<br>&nbsp;&nbsp;&nbsp; if(n1&gt;n2) n1^=n2^=n1^=n2;<br>&nbsp;&nbsp;&nbsp; if(n1&gt;&gt;11!=n2&gt;&gt;11)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=(n1&gt;&gt;11)+2;i&lt;=n2&gt;&gt;11;i++) m+=S[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumx(n1,((n1&gt;&gt;11)+1)&lt;&lt;11);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumx((n2&gt;&gt;11)&lt;&lt;11,n2+1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumx(n1,n2+1);<br>&nbsp;&nbsp;&nbsp; if(n1==1) m--;<br>&nbsp;&nbsp;&nbsp; printf("%ld\n",m);<br>&nbsp; }<br>&nbsp; return 0;<br>}<br></div>
<img src ="http://www.cppblog.com/sunkai/aggbug/46245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-04-04 11:10 <a href="http://www.cppblog.com/sunkai/archive/2008/04/04/46245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 59：马的周游问题★★★★★- Special Judged</title><link>http://www.cppblog.com/sunkai/archive/2008/04/04/46244.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 04 Apr 2008 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/04/04/46244.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/46244.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/04/04/46244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/46244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/46244.html</trackback:ping><description><![CDATA[<p>/*<br>习题 59：马的周游问题★★★★★- Special Judged<br>题目描述：<br>这样一个8 * 8的国际象棋棋盘用以下的方法编号如下：<br>1&nbsp; 2&nbsp; 3&nbsp; 4&nbsp; 5&nbsp; 6&nbsp; 7&nbsp; 8<br>9&nbsp; 10 11 12 13 14 15 16<br>17 18 19 20 21 22 23 24<br>25 26 27 28 29 30 31 32<br>33 34 35 36 37 38 39 40<br>41 42 43 44 45 46 47 48<br>49 50 51 52 53 54 55 56<br>57 58 59 60 61 62 63 64</p>
<p>输入：<br>有多个测试，每个测试一行，<br>每行一个整数N(1&lt;=N&lt;=64)，表示马的起点。<br>最后一行用-1表示结束，不用处理。</p>
<p>输出：<br>对输入的每一个起点，求一条周游线路。对应地输出一行，<br>有64个整数，从起点开始按顺序给出马每次经过的棋盘方格的编号。<br>相邻的数字用一个空格分开。</p>
<p>样例输入：<br>4<br>-1</p>
<p>样例输出：<br>（无样例输出）</p>
<p>其它：<br>如果起点和输入给定的不同，重复多次经过同一方格或者有的方格没有被经过，都会被认为是错误的。</p>
<p>题目提供：<br>ailyanlu</p>
<p>Special Judged<br>难度：Very Difficult<br>*/<br><br>AC程序:<br>#include&lt;stdio.h&gt;<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i,n;<br>&nbsp;&nbsp;&nbsp; int x[]={10,20,30,40,46,56,62,52,58,43,53,63,48,54,64,47,37,31,21,27,33,50,60,45,55,61,51,57,42,36,26,41,35,25,19,9,3,13,28,38,32,15,5,11,1,18,12,2,17,34,49,59,44,29,39,24,7,22,16,6,23,8,14,4};<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n),n!=-1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=0; while(x[i]!=n) i++; do printf("%d ",x[i++]); while(i&lt;64);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=0; while(x[i]!=n) printf("%d ",x[i++]); printf("\n");<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>附程序: 预先计算特殊表(循环表) 经过测试,输入10后可以得到以上AC程序中的特殊循环表<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int map[65];<br>int line[65];<br>int dfs(int now,int time)<br>{<br>&nbsp;&nbsp;&nbsp; int next;<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; int flag=0;<br>&nbsp;&nbsp;&nbsp; if(time==65) return 1;<br>&nbsp;&nbsp;&nbsp; map[now]=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;65;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!map[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i+10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&lt;6 &amp;&amp; next&lt;65 &amp;&amp; !map[next]) flag=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i+6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&gt;1 &amp;&amp; next&lt;65 &amp;&amp; !map[next]) flag=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i+17;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&lt;7 &amp;&amp; next&lt;65 &amp;&amp; !map[next]) flag=3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i+15;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&gt;0 &amp;&amp; next&lt;65 &amp;&amp; !map[next]) flag=4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i-6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&lt;6 &amp;&amp; next&gt;0 &amp;&amp; !map[next]) flag=5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i-10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&gt;1 &amp;&amp; next&gt;0 &amp;&amp; !map[next]) flag=6;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i-15;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&lt;7 &amp;&amp; next&gt;0 &amp;&amp; !map[next]) flag=7;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next=i-17;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((i-1)%8&gt;0 &amp;&amp; next&gt;0 &amp;&amp; !map[next]) flag=8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag) return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; map[now]=1;<br>&nbsp;&nbsp;&nbsp; next=now+10;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&lt;6 &amp;&amp; next&lt;65 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now+6;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&gt;1 &amp;&amp; next&lt;65 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now+17;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&lt;7 &amp;&amp; next&lt;65 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now+15;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&gt;0 &amp;&amp; next&lt;65 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now-6;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&lt;6 &amp;&amp; next&gt;0 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now-10;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&gt;1 &amp;&amp; next&gt;0 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now-15;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&lt;7 &amp;&amp; next&gt;0 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; next=now-17;<br>&nbsp;&nbsp;&nbsp; if((now-1)%8&gt;0 &amp;&amp; next&gt;0 &amp;&amp; !map[next])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[time]=next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(next,time+1)) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[next]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,k;<br>&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=-1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(map,0,sizeof(map));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[n]=1; line[1]=n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dfs(n,2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;65;i++) printf("%d ",line[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br></p>
<img src ="http://www.cppblog.com/sunkai/aggbug/46244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-04-04 11:07 <a href="http://www.cppblog.com/sunkai/archive/2008/04/04/46244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 41：二进制环★★</title><link>http://www.cppblog.com/sunkai/archive/2008/04/04/46243.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 04 Apr 2008 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/04/04/46243.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/46243.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/04/04/46243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/46243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/46243.html</trackback:ping><description><![CDATA[<p>/*<br>E-mail: sunkai [at] msn [dot] com<br>Author: Sun Kai<br>2008.4.4</p>
<p>习题 41：二进制环★★</p>
<p><br>问题描述：<br>一个数，把它化成二进制后，例如3，转为0011后，串长为2^2，把它看成一个环0-&gt;0-&gt;1-&gt;1-&gt;0<br>两个相邻的数取出分别得到00 01 11 10，刚好把4以内的所有数都有且仅有一次表示了出来<br>又例如29，化为00011101后，串长为2^3，三个三个地取可得到<br>000 001 011 111 110 101 010 100，也刚好把8以内所有数有且仅有一次表示了出来</p>
<p>输入：<br>多组测试数据，输入一个数n(0&lt;=n&lt;=12)，找出串长为2^n的一个以0,1组成的字符串，<br>把它n个n个地取要能得到2^n以内所有的数，并且这个字符串所代表的数值要最小</p>
<p>输出：<br>对每组测试数据输出这样的一个串长为2^n的一个以0,1组成的字符串</p>
<p>样例输入：<br>1<br>3<br>0<br>2</p>
<p>样例输出：<br>01<br>00010111<br>ERROR<br>0011</p>
<p>其它提示：<br>输入为2的时候，不但0011可以，0110，1100，1001都可以，因为它是一个环。<br>但你不能输出1100，因为1100是10进制的12，比3(0011)要大，要输出最小的那个</p>
<p>难度：easy<br>*/<br>#include&lt;stdio.h&gt;<br>#include&lt;math.h&gt;<br>#include&lt;string.h&gt;<br>char ok[4096];<br>char q[8192];<br>int n;<br>int size;<br>int dfs(int now) /* now : 当前待填数(0/1)下标 */ <br>{<br>&nbsp;&nbsp;&nbsp; int tmp;<br>&nbsp;&nbsp;&nbsp; int sum;<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;&nbsp;&nbsp; if(now==size+n-1) return 1;<br>&nbsp;&nbsp;&nbsp; if(now==size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=now,j=0;j&lt;n-1;i++,j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[i]=q[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(now&gt;=n-1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(now&lt;size) q[now]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=now-n+1;i&lt;=now;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(q[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum+=pow(2,tmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!ok[sum])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok[sum]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=dfs(now+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok[sum]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tmp) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(now&lt;size) q[now]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!ok[sum])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok[sum]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=dfs(now+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok[sum]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tmp) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[now]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[now]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=dfs(now+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tmp) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[now]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp=dfs(now+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tmp) return 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[now]=0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n==0) { printf("ERROR\n"); continue; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(ok,0,sizeof(ok));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size=pow(2,n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dfs(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;size;i++) printf("%d",q[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p><br>&nbsp;</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/46243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-04-04 11:03 <a href="http://www.cppblog.com/sunkai/archive/2008/04/04/46243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 95：恶魔岛救公主(3)★★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/08/43983.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Sat, 08 Mar 2008 10:42:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/08/43983.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43983.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/08/43983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43983.html</trackback:ping><description><![CDATA[<p>/*<br>习题 95：恶魔岛救公主(3)★★★★★(Contest 12)<br>题目描述：<br>Goldfisher为了解救被绑架的未婚妻而来到了恶魔岛。<br>上岛前，一个神秘的印度人Yingnan告诉他恶魔岛处处布满陷阱，<br>给Goldfisher画了一个草图，如一个4*4的房间布局如下：<br>1 6 2 4<br>2 3 1 2<br>1 5 9 3<br>9 1 2 1<br>每前进一步，只能选择进入上下左右任一房间。<br>而Goldfisher首先将站在左上方的格子，<br>数字表示那个房间里藏着的魔法豆的数目，<br>Goldfisher每进入一个房间就要把那个房间里的所有魔法豆取走。<br>而他的未婚妻就在最右下方的房间中。<br>Goldfisher必须以最短的路线救走他的未婚妻并返回出发点，<br>并把他手上所有的魔法豆倒进时空机器，当有足够多的魔法豆，<br>时空机才会送他们回去。这时Goldfisher犯难了，<br>因为他不知道需要多少魔法豆才足够，所以希望尽可能多拿，<br>但问题又必须以最短的路线，否则被敌人发现的话，<br>就连自己也逃不掉了。他希望找出这样一条路线，<br>尽可能地短，并且能尽可能多取得魔法豆。<br>如上图应该走1-6-3-5-9-3-1(返回)-2-1-9-1-2-1<br>一共有1+6+3+5+9+3+1+2+1+9+1+2=43个魔法豆。<br>你能帮助Goldfisher找到正确的道路解救他的未婚妻吗？</p>
<p>输入：<br>有多个测试，每个测试第一行分别是两个整数m,n(2&lt;=m,n&lt;=100)，<br>接下来的m行n列按顺序地描述了这个地图上相应房间里的魔法豆的数目。<br>数目在0到10000之间（包括两端）。<br>最后当输入的m=n=0表示结束。</p>
<p>输出：<br>对于每个测试，输出当路线最短时，<br>最多可以得到的魔法豆的数目</p>
<p>样例输入：<br>4 4<br>1 6 2 4<br>2 3 1 2<br>1 5 9 3<br>9 1 2 1<br>3 4<br>0 1 1 0<br>1 0 1 0<br>0 1 1 0<br>0 0</p>
<p>样例输出：<br>43<br>6</p>
<p>其它信息：</p>
<p><br>难度：Very Difficult<br>*/<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int map[256][256];<br>int d[2][256][256];<br>/* 阶段,X1,X2 */ <br>int max(int a,int b)<br>{<br>&nbsp;&nbsp;&nbsp; return a&gt;b ? a : b;<br>}<br>int min(int a,int b)<br>{<br>&nbsp;&nbsp;&nbsp; return a&gt;b ? b : a;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int m,n;<br>&nbsp;&nbsp;&nbsp; int t;<br>&nbsp;&nbsp;&nbsp; int x;<br>&nbsp;&nbsp;&nbsp; int i,j,k;<br>&nbsp;&nbsp;&nbsp; int *dst,*src,*temp;<br>&nbsp;&nbsp;&nbsp; dst=&amp;d[0][0][0];<br>&nbsp;&nbsp;&nbsp; src=&amp;d[1][0][0];<br>&nbsp;&nbsp;&nbsp; while(1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;m,&amp;n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m==0 &amp;&amp; n==0) break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=m+n-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=max(m,n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=m;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;map[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(d,0,sizeof(d));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=x;i++) /*i:阶段*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=dst; dst=src; src=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=min(i,n);j++) /* X1 */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=j;k++) /* X2 */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst[j*256+k]=max(max(src[(j-1)*256+k-1],src[j*256+k-1]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max(src[(j-1)*256+k],src[j*256+k]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(j==k) dst[j*256+k]+=map[i-k+1][k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else dst[j*256+k]+=map[i-j+1][j]+map[i-k+1][k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",dst[n*256+n]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-08 18:42 <a href="http://www.cppblog.com/sunkai/archive/2008/03/08/43983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 94：天神的羊群★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/08/43982.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Sat, 08 Mar 2008 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/08/43982.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43982.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/08/43982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43982.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43982.html</trackback:ping><description><![CDATA[<p>/*<br>习题 94：天神的羊群★★★(Contest 12)<br>题目描述：<br>天神有一群羊，一共k只，要带它们去放牧。<br>草地上有一排距离不等的木桩，共有n个，n&gt;=k。<br>现在天神需要把羊都拴在木桩上，一羊一桩，让羊在木桩周围吃草。<br>不过，天神的羊和普通的羊也很不一样，它们很聪明，并且很贪心，<br>还不喜欢看到别的羊比自己多占便宜。<br>为了能每只羊都能吃到一样多的草，拴羊的绳子都必须一样的长。<br>天神也知道它们的贪心，所以也想办法尽可能满足它们，<br>希望绳子能尽可能地长。但同时，不能让同一地方的草，<br>能同时被两只以上的羊吃到，这样它们会打架抢地盘的，<br>并且那样就会不公平了，就会有羊吃的比其它的羊要少。</p>
<p>输入：<br>第一行依次有两个整数n,k，其中2&lt;=k&lt;=n&lt;=100000，<br>接下来一行有n个整数，代表木桩的位置，范围从-1e9到+1e9</p>
<p>输出：<br>输出距离最近的两只羊之间的最大距离</p>
<p>样例输入：<br>5 3<br>2 5 1 10 7</p>
<p>样例输出：<br>4</p>
<p>其它信息：<br>把这三只羊安排在1,5,10三根桩上，距离最近的两只羊之间<br>的距离是5-1=4，而其它的安排方法没有比4更大的，<br>所以4就是结果。</p>
<p>难度：Normal<br>*/<br>#include&lt;stdio.h&gt;<br>int n,k;<br>int l[100001];<br>void qsort(int low,int high,int key[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; int i=low,j=high,tag=key[i];<br>&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(tag&lt;key[j] &amp;&amp; i&lt;j) j--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[i]=key[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(tag&gt;=key[i] &amp;&amp; i&lt;j) i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i&lt;j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[j]=key[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }while(i&lt;j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key[i]=tag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qsort(low,j-1,key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qsort(i+1,high,key);<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,t,count;<br>&nbsp;&nbsp;&nbsp; int mid,max,min=0;<br>&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;n,&amp;k); t=k-1;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++) scanf("%d",&amp;l[i]);<br>&nbsp;&nbsp;&nbsp; qsort(1,n,l);<br>&nbsp;&nbsp;&nbsp; for(i=2;i&lt;=n;i++) if(l[i]-l[i-1]&gt;min) min=l[i]-l[i-1];<br>&nbsp;&nbsp;&nbsp; max=(l[n]-l[1])/t; mid=(max+min)/2;<br>&nbsp;&nbsp;&nbsp; while(max&gt;=min)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count=t,j=l[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=2;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!count) break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(l[n]-l[i]&lt;(count-1)*mid) break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(l[i]-j&gt;=mid)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j=l[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(count) max=mid-1; else min=mid+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mid=(max+min)&gt;&gt;1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; printf("%d\n",mid);<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-08 18:40 <a href="http://www.cppblog.com/sunkai/archive/2008/03/08/43982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 92：高精度算阶乘★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/08/43981.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Sat, 08 Mar 2008 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/08/43981.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43981.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/08/43981.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43981.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43981.html</trackback:ping><description><![CDATA[<p>/*<br>习题 92：高精度算阶乘★★<br>题目描述：<br>算出n!的完整结果，其中n!=1*2*3*...*n</p>
<p>输入：<br>多组测试数据，一行一组，每行仅一个数n<br>其中0&lt;=n&lt;=10000</p>
<p>输出：<br>输出相应的n!的结果，必须精确到个位</p>
<p>样例输入：<br>10<br>20<br>100</p>
<p>样例输出：<br>3628800<br>2432902008176640000<br>933262154439441526816992388562667004907159682643816214685929<br>638952175999932299156089414639761565182862536979208272237582<br>51185210916864000000000000000000000000</p>
<p>其它信息：<br>最后一个100!的结果由于过长，故拆分成三行，每行60字符，请见谅</p>
<p>难度：Easy<br>*/<br>#include&lt;stdio.h&gt;<br>#define SIZE 8000<br>#define DS 7998<br>unsigned x[SIZE],n,p,i,j,t;<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=DS; x[DS]=1; x[DS+1]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p--; x[p]=0; p--; x[p]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=DS;j&gt;p;j--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[j]*=i; t=j+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[j]+=x[t]/100000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[t]%=100000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!x[p]) p++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%u",x[p]); p++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(;p&lt;SIZE-1;p++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%05u",x[p]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-08 18:30 <a href="http://www.cppblog.com/sunkai/archive/2008/03/08/43981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 89：Coupons ★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43922.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:09:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43922.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43922.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43922.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43922.html</trackback:ping><description><![CDATA[<p>/*<br>习题 89：Coupons ★★★★<br>题目描述：<br>FireDancer最近迷上了一个填数的游戏：一个n*n的正方形棋盘，要把从1到n2的整数填入到这个棋盘的每一个格子里（随意）。玩了很多次后，FireDancer发现了很多有趣的性质，他现在想考考你。他希望你得到一种棋盘的填法，使得任意相邻的两个格子里的数相加的最大值最小。这里的相邻指的是四个方向上的有公共边的相邻，而不是八个方向上的相邻。</p>
<p>输入：<br>有且只有一个整数n（2&lt;=n&lt;=50）。</p>
<p>输出：<br>一个整数，为最小的那个值。</p>
<p>样例输入：<br>2</p>
<p>样例输出：<br>6</p>
<p>其它信息：<br>一种最优填数方案为<br>1 4<br>3 2<br>此时，所有相邻的格子中4+2的和最大，为6。<br>若按以下方法填数<br>1 3<br>2 4<br>则，4+3的和最大，为7，没有6来得优。</p>
<p>题目提供：<br>ailyanlu</p>
<p>难度：Hard<br>*/<br>#include&lt;stdio.h&gt;<br>int x[52][52]={0};<br>int m(int a,int b)<br>{<br>&nbsp;&nbsp;&nbsp; if(a&gt;b) return a; else return b;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j,k,t;<br>&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp; int n2;<br>&nbsp;&nbsp;&nbsp; int flag;<br>&nbsp;&nbsp;&nbsp; int maxi[2],maxj[2],max;<br>&nbsp;&nbsp;&nbsp; int si,sj;<br>&nbsp;&nbsp;&nbsp; int ri,rj;<br>&nbsp;&nbsp;&nbsp; int temp;<br>&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br>&nbsp;&nbsp;&nbsp; n2=n*n;<br>&nbsp;&nbsp;&nbsp; k=(n2+1)/2;<br>&nbsp;&nbsp;&nbsp; if(n2%2==0) k++;<br>&nbsp;&nbsp;&nbsp; t=1;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%2==j%2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i][j]=k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i][j]=t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; flag=1;<br>&nbsp;&nbsp;&nbsp; while(flag)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxi[1]=maxi[2]=maxj[1]=maxj[2]=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((temp=x[i][j]+x[i][j+1])&gt;max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxi[1]=maxi[2]=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxj[1]=j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxj[2]=j+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((temp=x[i][j]+x[i+1][j])&gt;max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxi[1]=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxi[2]=i+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxj[1]=maxj[2]=j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(maxi[1]%2!=maxj[1]%2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si=maxi[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sj=maxj[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ri=maxi[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rj=maxj[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; si=maxi[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sj=maxj[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ri=maxi[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rj=maxj[1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%2!=j%2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m(m(m(x[si][sj]+x[i][j-1],x[si][sj]+x[i][j+1]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m(x[si][sj]+x[i-1][j],x[si][sj]+x[i+1][j])),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i][j]+x[ri][rj])&lt;max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=x[i][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i][j]=x[si][sj];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[si][sj]=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto next;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next: ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d ",x[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp; }*/<br>&nbsp;&nbsp;&nbsp; printf("%d",max);<br>&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; while(1);<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:09 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题75：石子合并★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43921.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:08:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43921.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43921.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43921.html</trackback:ping><description><![CDATA[<p>/*<br>75：石子合并★★★★<br>题目描述：<br>有n堆石子，每次可以将任意两堆合并为一堆，这次操作消耗的体力是这两堆石子数之和。最终需要将n堆石子合并为一堆，问最少要多少体力？<br>这些石子十分特殊：一开始的时候第i堆石子有i个石子，i=1,2,...,n</p>
<p>输入：<br>有多组测试数据，每行一个正整数n，n&lt;=5e8<br>以EOF标志结束程序。</p>
<p>输出：<br>对于每组测试，每行输出一个数，<br>表示最少所需要的体力</p>
<p>样例输入：<br>2<br>3</p>
<p>样例输出：<br>3<br>9</p>
<p>其它：<br>题目提供：FancyMouse</p>
<p>难度：Hard<br>*/<br>#include&lt;stdio.h&gt;<br>typedef struct<br>{<br>&nbsp; long long i,x1,x2,x3,x,c;<br>} data;<br>data s[101]=<br>{<br>{4ll,9ll,6ll,4ll,3ll,4ll},<br>{5000000ll,275139846620928ll,113708544ll,24ll,3145728ll,1291457ll},<br>{10000000ll,1150559277775168ll,237417088ll,25ll,6291456ll,2582913ll},<br>{15000000ll,2653065938683584ll,364834176ll,26ll,12582912ll,10165825ll},<br>{20000000ll,4802236883683584ll,494834176ll,26ll,12582912ll,5165825ll},<br>{25000000ll,7601407828683584ll,624834176ll,26ll,12582912ll,165825ll},<br>{30000000ll,11062263404900160ll,759668352ll,27ll,25165824ll,20331649ll},<br>{35000000ll,15198105232400160ll,894668352ll,27ll,25165824ll,15331649ll},<br>{40000000ll,20008947059900160ll,1029668352ll,27ll,25165824ll,10331649ll},<br>{45000000ll,25494788887400160ll,1164668352ll,27ll,25165824ll,5331649ll},<br>{50000000ll,31655630714900160ll,1299668352ll,27ll,25165824ll,331649ll},<br>{55000000ll,38502369299932288ll,1439336704ll,28ll,50331648ll,45663297ll},<br>{60000000ll,46049052889932288ll,1579336704ll,28ll,50331648ll,40663297ll},<br>{65000000ll,54295736479932288ll,1719336704ll,28ll,50331648ll,35663297ll},<br>{70000000ll,63242420069932288ll,1859336704ll,28ll,50331648ll,30663297ll},<br>{75000000ll,72889103659932288ll,1999336704ll,28ll,50331648ll,25663297ll},<br>{80000000ll,83235787249932288ll,2139336704ll,28ll,50331648ll,20663297ll},<br>{85000000ll,94282470839932288ll,2279336704ll,28ll,50331648ll,15663297ll},<br>{90000000ll,106029154429932288ll,2419336704ll,28ll,50331648ll,10663297ll},<br>{95000000ll,118475838019932288ll,2559336704ll,28ll,50331648ll,5663297ll},<br>{100000000ll,131622521609932288ll,2699336704ll,28ll,50331648ll,663297ll},<br>{105000000ll,145478608702892448ll,2843673408ll,29ll,100663296ll,96326593ll},<br>{110000000ll,160059475815392448ll,2988673408ll,29ll,100663296ll,91326593ll},<br>{115000000ll,175365342927892448ll,3133673408ll,29ll,100663296ll,86326593ll},<br>{120000000ll,191396210040392448ll,3278673408ll,29ll,100663296ll,81326593ll},<br>{125000000ll,208152077152892448ll,3423673408ll,29ll,100663296ll,76326593ll},<br>{130000000ll,225632944265392448ll,3568673408ll,29ll,100663296ll,71326593ll},<br>{135000000ll,243838811377892448ll,3713673408ll,29ll,100663296ll,66326593ll},<br>{140000000ll,262769678490392448ll,3858673408ll,29ll,100663296ll,61326593ll},<br>{145000000ll,282425545602892448ll,4003673408ll,29ll,100663296ll,56326593ll},<br>{150000000ll,302806412715392448ll,4148673408ll,29ll,100663296ll,51326593ll},<br>{155000000ll,323912279827892448ll,4293673408ll,29ll,100663296ll,46326593ll},<br>{160000000ll,345743146940392448ll,4438673408ll,29ll,100663296ll,41326593ll},<br>{165000000ll,368299014052892448ll,4583673408ll,29ll,100663296ll,36326593ll},<br>{170000000ll,391579881165392448ll,4728673408ll,29ll,100663296ll,31326593ll},<br>{175000000ll,415585748277892448ll,4873673408ll,29ll,100663296ll,26326593ll},<br>{180000000ll,440316615390392448ll,5018673408ll,29ll,100663296ll,21326593ll},<br>{185000000ll,465772482502892448ll,5163673408ll,29ll,100663296ll,16326593ll},<br>{190000000ll,491953349615392448ll,5308673408ll,29ll,100663296ll,11326593ll},<br>{195000000ll,518859216727892448ll,5453673408ll,29ll,100663296ll,6326593ll},<br>{200000000ll,546490083840392448ll,5598673408ll,29ll,100663296ll,1326593ll},<br>{205000000ll,574852697917896384ll,5747346816ll,30ll,201326592ll,197653185ll},<br>{210000000ll,603964432072896384ll,5897346816ll,30ll,201326592ll,192653185ll},<br>{215000000ll,633826166227896384ll,6047346816ll,30ll,201326592ll,187653185ll},<br>{220000000ll,664437900382896384ll,6197346816ll,30ll,201326592ll,182653185ll},<br>{225000000ll,695799634537896384ll,6347346816ll,30ll,201326592ll,177653185ll},<br>{230000000ll,727911368692896384ll,6497346816ll,30ll,201326592ll,172653185ll},<br>{235000000ll,760773102847896384ll,6647346816ll,30ll,201326592ll,167653185ll},<br>{240000000ll,794384837002896384ll,6797346816ll,30ll,201326592ll,162653185ll},<br>{245000000ll,828746571157896384ll,6947346816ll,30ll,201326592ll,157653185ll},<br>{250000000ll,863858305312896384ll,7097346816ll,30ll,201326592ll,152653185ll},<br>{255000000ll,899720039467896384ll,7247346816ll,30ll,201326592ll,147653185ll},<br>{260000000ll,936331773622896384ll,7397346816ll,30ll,201326592ll,142653185ll},<br>{265000000ll,973693507777896384ll,7547346816ll,30ll,201326592ll,137653185ll},<br>{270000000ll,1011805241932896384ll,7697346816ll,30ll,201326592ll,132653185ll},<br>{275000000ll,1050666976087896384ll,7847346816ll,30ll,201326592ll,127653185ll},<br>{280000000ll,1090278710242896384ll,7997346816ll,30ll,201326592ll,122653185ll},<br>{285000000ll,1130640444397896384ll,8147346816ll,30ll,201326592ll,117653185ll},<br>{290000000ll,1171752178552896384ll,8297346816ll,30ll,201326592ll,112653185ll},<br>{295000000ll,1213613912707896384ll,8447346816ll,30ll,201326592ll,107653185ll},<br>{300000000ll,1256225646862896384ll,8597346816ll,30ll,201326592ll,102653185ll},<br>{305000000ll,1299587381017896384ll,8747346816ll,30ll,201326592ll,97653185ll},<br>{310000000ll,1343699115172896384ll,8897346816ll,30ll,201326592ll,92653185ll},<br>{315000000ll,1388560849327896384ll,9047346816ll,30ll,201326592ll,87653185ll},<br>{320000000ll,1434172583482896384ll,9197346816ll,30ll,201326592ll,82653185ll},<br>{325000000ll,1480534317637896384ll,9347346816ll,30ll,201326592ll,77653185ll},<br>{330000000ll,1527646051792896384ll,9497346816ll,30ll,201326592ll,72653185ll},<br>{335000000ll,1575507785947896384ll,9647346816ll,30ll,201326592ll,67653185ll},<br>{340000000ll,1624119520102896384ll,9797346816ll,30ll,201326592ll,62653185ll},<br>{345000000ll,1673481254257896384ll,9947346816ll,30ll,201326592ll,57653185ll},<br>{350000000ll,1723592988412896384ll,10097346816ll,30ll,201326592ll,52653185ll},<br>{355000000ll,1774454722567896384ll,10247346816ll,30ll,201326592ll,47653185ll},<br>{360000000ll,1826066456722896384ll,10397346816ll,30ll,201326592ll,42653185ll},<br>{365000000ll,1878428190877896384ll,10547346816ll,30ll,201326592ll,37653185ll},<br>{370000000ll,1931539925032896384ll,10697346816ll,30ll,201326592ll,32653185ll},<br>{375000000ll,1985401659187896384ll,10847346816ll,30ll,201326592ll,27653185ll},<br>{380000000ll,2040013393342896384ll,10997346816ll,30ll,201326592ll,22653185ll},<br>{385000000ll,2095375127497896384ll,11147346816ll,30ll,201326592ll,17653185ll},<br>{390000000ll,2151486861652896384ll,11297346816ll,30ll,201326592ll,12653185ll},<br>{395000000ll,2208348595807896384ll,11447346816ll,30ll,201326592ll,7653185ll},<br>{400000000ll,2265960329962896384ll,11597346816ll,30ll,201326592ll,2653185ll},<br>{405000000ll,2324324817891738720ll,11749693632ll,31ll,402653184ll,400306369ll},<br>{410000000ll,2383460786129238720ll,11904693632ll,31ll,402653184ll,395306369ll},<br>{415000000ll,2443371754366738720ll,12059693632ll,31ll,402653184ll,390306369ll},<br>{420000000ll,2504057722604238720ll,12214693632ll,31ll,402653184ll,385306369ll},<br>{425000000ll,2565518690841738720ll,12369693632ll,31ll,402653184ll,380306369ll},<br>{430000000ll,2627754659079238720ll,12524693632ll,31ll,402653184ll,375306369ll},<br>{435000000ll,2690765627316738720ll,12679693632ll,31ll,402653184ll,370306369ll},<br>{440000000ll,2754551595554238720ll,12834693632ll,31ll,402653184ll,365306369ll},<br>{445000000ll,2819112563791738720ll,12989693632ll,31ll,402653184ll,360306369ll},<br>{450000000ll,2884448532029238720ll,13144693632ll,31ll,402653184ll,355306369ll},<br>{455000000ll,2950559500266738720ll,13299693632ll,31ll,402653184ll,350306369ll},<br>{460000000ll,3017445468504238720ll,13454693632ll,31ll,402653184ll,345306369ll},<br>{465000000ll,3085106436741738720ll,13609693632ll,31ll,402653184ll,340306369ll},<br>{470000000ll,3153542404979238720ll,13764693632ll,31ll,402653184ll,335306369ll},<br>{475000000ll,3222753373216738720ll,13919693632ll,31ll,402653184ll,330306369ll},<br>{480000000ll,3292739341454238720ll,14074693632ll,31ll,402653184ll,325306369ll},<br>{485000000ll,3363500309691738720ll,14229693632ll,31ll,402653184ll,320306369ll},<br>{490000000ll,3435036277929238720ll,14384693632ll,31ll,402653184ll,315306369ll},<br>{495000000ll,3507347246166738720ll,14539693632ll,31ll,402653184ll,310306369ll},<br>{500000000ll,3580433214404238720ll,14694693632ll,31ll,402653184ll,305306369}<br>};</p>
<p>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; long long i,x1,x2,x3,n,x,c,p;<br>&nbsp;&nbsp;&nbsp; while(scanf("%I64d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n==1) printf("0\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(n==2) printf("3\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(n==3) printf("9\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;99;i++) if(s[i].i&lt;n) p=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(p&gt;0) s[p].i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1=s[p].x1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2=s[p].x2; x3=s[p].x3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=s[p].x; c=s[p].c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=s[p].i;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c--;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!c) { x*=2; x3++; c=x;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2=x2+x3;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1=x2+x1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%I64d\n",x1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:08 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题67：The 3n+1 Problem(2) ★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43920.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:06:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43920.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43920.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43920.html</trackback:ping><description><![CDATA[<p>/*<br>67：The 3n+1 Problem(2) ★★★★<br>题目描述：<br>这是一个古老的猜想：给定任何一个正整数n，对它进行以下操作：<br>n是偶数：n=n/2<br>n是奇数：n=3*n+1<br>这样经过多步操作后，最后必定变为1<br>如对13进行操作： 13 -&gt; 40 -&gt; 20 -&gt; 10 -&gt; 5 -&gt; 16 -&gt; 8 -&gt; 4 -&gt; 2 -&gt; 1<br>一共经历了9次操作，则称13这个数的周期是9</p>
<p>输入：<br>多组测试数据，每组一行，一行里有两个数m和n，<br>请你找出m和n之间（包括m,n）的周期最大的数的周期<br>其中m,n均为小于或者等于2e6的正整数</p>
<p>输出：<br>m,n之间周期最大的数的周期，一个结果单独占一行</p>
<p>样例输入：<br>1 10<br>2 3<br>30 100</p>
<p>样例输出：<br>19<br>7<br>118</p>
<p>难度：Hard<br>*/<br>#ifdef TEST<br>#include&lt;time.h&gt;<br>#endif<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>#define SIZE 2000001<br>#define DIS 1000<br>int x[SIZE];<br>int hash[2001];<br>int dfs(long long now) /*记忆化搜索*/<br>{<br>&nbsp;&nbsp;&nbsp; int c;<br>&nbsp;&nbsp;&nbsp; if(now&lt;SIZE &amp;&amp; x[now]) return x[now];<br>&nbsp;&nbsp;&nbsp; if(now &amp; 1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=dfs(now*3+1)+1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=dfs(now&gt;&gt;1)+1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(now&lt;SIZE) x[now]=c;<br>&nbsp;&nbsp;&nbsp; return c;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,t,j;<br>&nbsp;&nbsp;&nbsp; int m,n,max;<br>&nbsp;&nbsp;&nbsp; #ifdef TEST<br>&nbsp;&nbsp;&nbsp; long time=clock();<br>&nbsp;&nbsp;&nbsp; freopen("test.in","r",stdin);<br>&nbsp;&nbsp;&nbsp; freopen("test.out","w",stdout);<br>&nbsp;&nbsp;&nbsp; #endif<br>&nbsp;&nbsp;&nbsp; memset(x,0,sizeof(x));<br>&nbsp;&nbsp;&nbsp; x[1]=1;<br>&nbsp;&nbsp;&nbsp; max=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;SIZE;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dfs(i)&gt;max) max=x[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%DIS==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash[i/DIS-1]=max;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #ifdef TEST<br>&nbsp;&nbsp;&nbsp; printf("Total time:%dms\n",clock()-time);<br>&nbsp;&nbsp;&nbsp; #endif<br>&nbsp;&nbsp;&nbsp; while(scanf("%d%d",&amp;m,&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m&gt;n) m^=n^=m^=n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=((m-1)/DIS+1)*DIS;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(t&gt;n) t=n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=(m-1)/DIS+1,j=n/DIS;i&lt;j;i++) if(max&lt;hash[i]) max=hash[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=m;i&lt;=t;i++) if(x[i]&gt;max) max=x[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=(n/DIS)*DIS;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(t&lt;m) t=m;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=t;i&lt;=n;i++) if(x[i]&gt;max) max=x[i];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",max-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; #ifdef TEST<br>&nbsp;&nbsp;&nbsp; printf("Total time:%dms\n",clock()-time);<br>&nbsp;&nbsp;&nbsp; #endif<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:06 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 36：The 3n+1 Problem ★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43919.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:05:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43919.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43919.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43919.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43919.html</trackback:ping><description><![CDATA[<p>/*<br>习题 36：The 3n+1 Problem ★★</p>
<p><br>问题描述：<br>这是一个古老的猜想：给定任何一个正整数n，对它进行以下操作：<br>n是偶数：n=n/2<br>n是奇数：n=3*n+1<br>这样经过多步操作后，最后必定变为1<br>如对13进行操作： 13 -&gt; 40 -&gt; 20 -&gt; 10 -&gt; 5 -&gt; 16 -&gt; 8 -&gt; 4 -&gt; 2 -&gt; 1<br>一共经历了9次操作，则称13这个数的周期是9</p>
<p>输入：<br>多组测试数据，每组一行，一行里有两个数m和n，<br>请你找出m和n之间（包括m,n）的周期最大的数的周期<br>其中m,n均为小于或者等于1e5的正整数</p>
<p>输出：<br>m,n之间周期最大的数的周期，一个结果单独占一行</p>
<p>样例输入：<br>1 10<br>2 3<br>30 100</p>
<p>样例输出：<br>19<br>7<br>118</p>
<p>难度：Easy<br>*/<br>#include&lt;stdio.h&gt;<br>/*<br>#include&lt;time.h&gt;<br>*/<br>int hash[100001]={0};<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int m,n;<br>&nbsp;&nbsp;&nbsp; int i,j,k,t;<br>&nbsp;&nbsp;&nbsp; int max;<br>&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; int time;<br>&nbsp;&nbsp;&nbsp; time=clock();<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;100001;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!hash[i])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t=i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(t!=1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(t%2) t=t*3+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else t&gt;&gt;=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash[i]++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=i,k=hash[i],t=i;j&lt;100001;j+=t,k++,t*=2) hash[j]=k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; printf("%d",clock()-time);<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;101;i++) printf("%3d ",hash[i]);<br>&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; while(scanf("%d%d",&amp;m,&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m&gt;n) m^=n^=m^=n; max=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=m;i&lt;=n;i++) if(hash[i]&gt;max) max=hash[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",max);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:05 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 32：最大数字子串之和★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43918.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:04:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43918.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43918.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43918.html</trackback:ping><description><![CDATA[<p>/*<br>注意数据中有负值<br>*/ <br>/*<br>习题 32：最大数字子串之和★★</p>
<p><br>输入n(1&lt;=n&lt;=1e6)和n个整数，这n个整数的绝对值均小于1000，求最大数字子串之和</p>
<p>样例输入：<br>9<br>-3 4 9 2 -10 -7 11 3 -8<br>13<br>-1 2 6 -3 5 -7 14 -5 -15 1 8 -4 9</p>
<p>样例输出：<br>15<br>17</p>
<p>提示：<br>在第一组中，最大的数字子串是4 9 2的和<br>在第二组中，最大的数字子串是2 6 -3 5 -7 14的和</p>
<p>难度：easy<br>*/<br>#include&lt;stdio.h&gt;<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int n,t,i;<br>&nbsp;&nbsp;&nbsp; int sum,max;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum=0; max=-10000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sum&gt;0) sum=sum+t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else sum=t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sum&gt;max) max=sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",max);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:04 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 26：滑雪★★★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43917.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43917.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43917.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43917.html</trackback:ping><description><![CDATA[<p>/*<br>习题 26：滑雪★★★★</p>
<p><br>Description<br>Michael喜欢滑雪但这并不奇怪， 因为滑雪的确很刺激。可是为了获得速度，滑的区域必须向下倾斜，而且当你滑到坡底，你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 </p>
<p><br>&nbsp;&nbsp; 1&nbsp; 2&nbsp; 3&nbsp; 4 5<br>&nbsp; 16 17 18 19 6<br>&nbsp; 15 24 25 20 7<br>&nbsp; 14 23 22 21 8<br>&nbsp; 13 12 11 10 9</p>
<p>一个人可以从某个点滑向上下左右相邻四个点之一，当且仅当高度减小。在上面的例子中，一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上，这是最长的一条。</p>
<p>Input<br>多组测试数据。输入的第一行表示区域的行数R和列数C(1 &lt;= R,C &lt;= 100)。下面是R行，每行有C个整数，代表高度h，0&lt;=h&lt;=10000。</p>
<p>Output<br>输出最长区域的长度。</p>
<p>Sample Input</p>
<p>5 5<br>1 2 3 4 5<br>16 17 18 19 6<br>15 24 25 20 7<br>14 23 22 21 8<br>13 12 11 10 9</p>
<p>Sample Output</p>
<p>25</p>
<p>难度：Hard<br>*/</p>
<p>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int map[101][101]={0};<br>int d[101][101]={0};<br>int to[4][2]={{1,0},{0,1},{-1,0},{0,-1}};<br>int r,c;<br>int ok(int x,int y)<br>{<br>&nbsp;&nbsp;&nbsp; if(x&gt;0 &amp;&amp; x&lt;=r &amp;&amp; y&gt;0 &amp;&amp; y&lt;=c) return 1;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>int dfs(int x,int y)<br>{<br>&nbsp;&nbsp;&nbsp; int k,t;<br>&nbsp;&nbsp;&nbsp; if(d[x][y]) return d[x][y];<br>&nbsp;&nbsp;&nbsp; for(k=0;k&lt;4;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ok(x+to[k][0],y+to[k][1]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(map[x+to[k][0]][y+to[k][1]]&lt;map[x][y])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((t=dfs(x+to[k][0],y+to[k][1])+1)&gt;d[x][y]) d[x][y]=t;<br>&nbsp;&nbsp;&nbsp; return d[x][y];<br>}&nbsp;&nbsp;&nbsp; <br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;&nbsp;&nbsp; int max;<br>&nbsp;&nbsp;&nbsp; while(scanf("%d%d",&amp;r,&amp;c)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(d,0,sizeof(d));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=r;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=c;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;map[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=r;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=c;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(max&lt;dfs(i,j)) max=d[i][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",max+1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:02 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 23：恶魔岛救公主★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43916.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 11:01:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43916.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43916.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43916.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43916.html</trackback:ping><description><![CDATA[<p>/*<br>习题 23：恶魔岛救公主★★</p>
<p>goldfisher为了解救被绑架的未婚妻而来到了恶魔岛。上岛前，一个神秘的印度人yingnan告诉他恶魔岛处处布满陷阱，只有沿着地上标记数字和为最大的路径才能找到公主。为此他给goldfisher画了一个草图，假使地上标记的数字如下：<br>&nbsp;&nbsp; 1<br>&nbsp; 2 3<br>&nbsp;1 5 9<br>9 1 1 1<br>其中的最大路径是1-3-9-1，最大的和是14，只有沿着这条路径走，才能找到公主。goldfisher犯难了，因为现实中标记的数字更多，难度更大。你能帮助goldfisher找到正确的道路解救他的未婚妻吗？</p>
<p><br>注:地图为等腰三角形，必须置顶向下，且每次仅能访问相邻两个子路径。本例中： <br>第一层 1 可达 2、3 两点&nbsp; <br>第二层 2 可达 1、5 两点 ; 3 可达 5、9 两点，以此类推</p>
<p>输入：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本题包含多组测试数据，其中第一行为N(1 &lt;= N &lt;= 100)，表示将要进过的关卡数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来N行为通往目的地图。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过判断End Of File结束程序<br>输出：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出 It will take him s steps!<br>其中 s为对应地图最长路径值。<br>输入样例：<br>4<br>1<br>2 3<br>1 5 9<br>9 1 1 1<br>5<br>7<br>3 8<br>8 1 0<br>2 7 4 4<br>4 5 2 6 5</p>
<p><br>输出样例：<br>It will take him 14 steps!<br>It will take him 30 steps!</p>
<p>难度：easy<br>*/<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int max(int r,int t)<br>{<br>&nbsp;&nbsp;&nbsp; if(r&gt;t) return r;<br>&nbsp;&nbsp;&nbsp; else return t;<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int i,j;<br>&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp; int temp;<br>&nbsp;&nbsp;&nbsp; int line[101]={0};<br>&nbsp;&nbsp;&nbsp; while(scanf("%d",&amp;n)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(line,0,sizeof(line));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=i;j&gt;0;j--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;temp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line[j]=max(line[j],line[j-1])+temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=n;i++) if(temp&lt;line[i]) temp=line[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("It will take him %d steps!\n",temp);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 19:01 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 9：上阶梯★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43915.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 10:59:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43915.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43915.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43915.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43915.html</trackback:ping><description><![CDATA[<p>/*<br>习题 9：上阶梯★★</p>
<p><br>上阶梯，你可以一个一个阶梯上，也可以两个两个地来，<br>也可以一个和二个间隔着上，甚至可以一次k个阶梯<br>问题是，上一个阶梯数为n，每步能上1至k个阶的话，<br>你有多少种方法走完它？</p>
<p>如 n = 5 , k = 2，可以<br>1,1,1,1,1<br>2,1,1,1<br>1,2,1,1<br>1,1,2,1<br>1,1,1,2<br>2,2,1<br>2,1,2<br>1,2,2<br>共8种</p>
<p>输入阶梯数n(1 &lt;= n &lt;= 30)和每步最大阶数k(1&lt;=k&lt;=n)：<br>5 2<br>5 3</p>
<p>输出：<br>8<br>13</p>
<p>难度：Easy<br>*/<br>#include&lt;stdio.h&gt;<br>#include&lt;string.h&gt;<br>int d[31][31];<br>int dfs(int left,int k)<br>{<br>&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp; if(d[left][k]!=-1) return d[left][k];<br>&nbsp;&nbsp;&nbsp; if(!left) return 1;<br>&nbsp;&nbsp;&nbsp; d[left][k]=0;<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;=((left&lt;k)?left:k);i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d[left][k]+=dfs(left-i,k);<br>&nbsp;&nbsp;&nbsp; return d[left][k];<br>}<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int n,k;<br>&nbsp;&nbsp;&nbsp; memset(d,-1,sizeof(d));<br>&nbsp;&nbsp;&nbsp; while(scanf("%d%d",&amp;n,&amp;k)!=EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",dfs(n,k));<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 18:59 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>习题 3：斐波那契数列★★</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43914.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 10:58:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43914.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43914.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43914.html</trackback:ping><description><![CDATA[<p>/*<br>习题 3：斐波那契数列★★</p>
<p><br>1,1,2,3,5,8,13,21............<br>这个数列是不是很熟悉？它就是斐波那契数列<br>来源于数学家列昂纳多&#183;斐波那契以兔子繁殖为例子而引入，故又称为&#8220;兔子数列&#8221;<br>问题：如果在第n天把兔子每k只放在一个笼子里，<br>问最后会剩下多少兔子呢？（第一二天都只有一只兔子）</p>
<p>输入n(1&lt;=n&lt;=1e9)和k(1&lt;=k&lt;=100) （分为多组数据，一组一行）<br>输出剩下的兔子数</p>
<p>输入：<br>6 3<br>8 6</p>
<p>输出：<br>2&nbsp;&nbsp;&nbsp;&nbsp; (第6天有8只，被3除的余数得到2)<br>3</p>
<p>问题难度：Easy<br>*/<br>#include&lt;stdio.h&gt;<br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int k,n;<br>&nbsp;&nbsp;&nbsp; int i,l[350];<br>&nbsp;&nbsp;&nbsp; while(scanf("%d%d",&amp;n,&amp;k)!=EOF)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[0]=0; i=l[1]=l[2]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(k==1) printf("0\n"); else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[i+1]=(l[i]+l[i-1])%k;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }while(l[i]!=1 || l[i+1]!=1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n=n%(i-1); printf("%d\n",l[n]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 18:58 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1: A + B Problem</title><link>http://www.cppblog.com/sunkai/archive/2008/03/07/43913.html</link><dc:creator>SunKai</dc:creator><author>SunKai</author><pubDate>Fri, 07 Mar 2008 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/sunkai/archive/2008/03/07/43913.html</guid><wfw:comment>http://www.cppblog.com/sunkai/comments/43913.html</wfw:comment><comments>http://www.cppblog.com/sunkai/archive/2008/03/07/43913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sunkai/comments/commentRss/43913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sunkai/services/trackbacks/43913.html</trackback:ping><description><![CDATA[<p>/*<br>1: A + B Problem</p>
<p>题目描述：<br>A + B Problem</p>
<p>输入：<br>多组测试数据，第一行有两个小于1e9的整数，<br>对这两个数求和，最后当EOF标志的时候结束。</p>
<p>输出：<br>对这两个数求和的结果</p>
<p>样例输入：<br>2 3<br>1 9</p>
<p>样例输出：<br>5<br>10</p>
<p>其它：<br>Just for try &amp; test</p>
<p>难度：no difficulty<br>*/<br>#include&lt;stdio.h&gt;<br>int main(void)<br>{<br>&nbsp; int a,b;<br>&nbsp; while(scanf("%d%d",&amp;a,&amp;b)!=EOF) &nbsp;printf("%d\n",a+b);<br>} </p>
<img src ="http://www.cppblog.com/sunkai/aggbug/43913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sunkai/" target="_blank">SunKai</a> 2008-03-07 18:56 <a href="http://www.cppblog.com/sunkai/archive/2008/03/07/43913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>