﻿<?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++博客-止于自娱-随笔分类-Miscellaneous</title><link>http://www.cppblog.com/yuziyu/category/10804.html</link><description>每天进步一点点,Coding Everyday!</description><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2009 09:29:11 GMT</lastBuildDate><pubDate>Thu, 16 Jul 2009 09:29:11 GMT</pubDate><ttl>60</ttl><item><title>[备忘]内存对齐问题</title><link>http://www.cppblog.com/yuziyu/archive/2009/07/15/90145.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Wed, 15 Jul 2009 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/07/15/90145.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/90145.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/07/15/90145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/90145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/90145.html</trackback:ping><description><![CDATA[
		<br />昨天和wub讨论，为什么struct对齐的时候，double类型的地址要以8对齐。<br />对齐的目的就是为了方便和加速处理器读取，那么只需要和字长对齐就可以了。<br />根据这两篇文章：<a href="http://blog.csdn.net/warrior3/archive/2006/11/20/1399591.aspx"><font size="3">《内存对齐与ANSI C中struct型数据的内存布局》</font></a>vs<a href="http://hi.baidu.com/phps/blog/item/f03eb93ee12f49fa838b1365.html">《难以理解的《内存对齐与ANSI C中struct型数据的内存布局》</a><a href="http://hi.baidu.com/phps/blog/item/f03eb93ee12f49fa838b1365.html">》</a><font size="3">gcc和vc下是不同的。<span style="font-size: 12pt; color: black;">对于double类型，默认gcc的</span><span style="font-size: 12pt; color: black;">对齐模数</span></font><span style="font-size: 12pt; color: black;"><font size="3">是4,VC是8.<br />内存对齐是与处理器，编译器，编译选项相关的，因此单纯给出一个struct，问其sizeof是多少，这样的问法是不严谨的。回答该问题，应该加以说明运行环境。<br />vc的默认对齐模数是：sizeof(该类型)<br />gcc的默认对齐规则是：byte为1,char为2,其他均为4.</font><br />由上可知<br />struct s{<br /> char c;<br /> double d;<br />};<br /><br />gcc下<br />sizeof(s) = 4+8 ＝ 12<br />vc下<br />sizeof(s) = 8+8 = 16<br /><br />那么 struct s{<br />double d;<br />char c;<br />};<br />起初我认为c以后不需要填充，因此gcc下sizeof(s)=8+1 = 9。但事实应该是sizeof(s)==8+4 = 12。<br />因为对于数组来说，要保证数组的大小等于数组的个数乘以元素的大小。因此c之后也是需要填充的,这样后续的元素的地址才会是字长的倍数。<br /></span><img src ="http://www.cppblog.com/yuziyu/aggbug/90145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-07-15 16:37 <a href="http://www.cppblog.com/yuziyu/archive/2009/07/15/90145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［备忘］封装printf</title><link>http://www.cppblog.com/yuziyu/archive/2009/07/12/89890.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Sun, 12 Jul 2009 13:07:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/07/12/89890.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/89890.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/07/12/89890.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/89890.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/89890.html</trackback:ping><description><![CDATA[写一个函数封装printf以trace<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> my_trace(</span><span style="color: rgb(0, 0, 255);">const</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">char</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">cmd,<img src="http://www.cppblog.com/images/dot.gif" />)<br />{<br />    va_list args;<br /><br />    va_start(args,cmd);<br />    vprintf(cmd,args); //必须用vprintf<br />    va_end(args);<br />}<br /></span></div><br /><br /><img src ="http://www.cppblog.com/yuziyu/aggbug/89890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-07-12 21:07 <a href="http://www.cppblog.com/yuziyu/archive/2009/07/12/89890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRM 444</title><link>http://www.cppblog.com/yuziyu/archive/2009/07/08/89565.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Wed, 08 Jul 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/07/08/89565.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/89565.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/07/08/89565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/89565.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/89565.html</trackback:ping><description><![CDATA[又在第一题上花了很多时间，这次更夸张。。用了20多分钟。。。最后提交时只有150分了。。<br />第二题，一看挺简单，就是求质因数的个数，然后看能被4的几次幂整除。<br />一开始匆忙写了一个，然后提交，400分。<br />代码如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">              </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> getLevel(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> N) <br />                  { <br />                  <br />                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                                  <br />                  </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">N;</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">i){                           <br />                           </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(N</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                         res</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                                         N</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">i;<br />                                         }                                                                           <br />                           }<br />                                                             <br />                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                  </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(res</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                  res</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />                                  r</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                   }<br /><br />                  </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> r;<br />                  } </span></div>后来一看，i*i&lt;=N这时，N一直在变，应该保存下N或者直接求sqrt(N)。一开始不太确定sqrt能否处理long long，因此用相乘的方法。后来cha人的时候，发现一个也犯了同样的错误，马上构造56=2*2*2*7,cha掉<br />于是改成下面，提交，只有299分了。。。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">              </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> getLevel(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> N) <br />                  { <br />                  <br />                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                  </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> T </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> N; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">增加这一行            </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                  </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">T;</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">i){                          <br />                           </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(N</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                         res</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                                         N</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">i;<br />                                         }                                                                          <br />                   }<br />                                                            <br />                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                  </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(res</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                  res</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />                                  r</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                   }<br /><br />                  </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> r;<br />                  } </span></div><br />结果还是被cha掉了。因为犯了一个严重的错误，没有算上最后一个质因数，这个质因数可能大于sqrt(N)。如88==2*2*2*11。<br />正确代码应该是<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">              </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> getLevel(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> N) <br />                  { <br />                  <br />                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                  </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> T </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> N;          <br />                  </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> i</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">&lt;=</span><span style="color: rgb(0, 0, 0);">T;</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">i){                          <br />                           </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(N</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">i</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                         res</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                                         N</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">i;<br />                                         }                                                                          <br />                   }<br />                          <br />                   </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(N</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">) res</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">; </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">增加这一行<br />                                  </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                  </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> r</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />                  </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">(res</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">){<br />                                  res</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">;<br />                                  r</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">;<br />                   }<br /><br />                  </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> r;<br />                  } </span></div><br />最后房间只有一人过了第二题。<br />还好cha了4个，不然rating要跌不少了。。<br />还好rating还是涨了一点点。。<br />太粗心了，不然就应该能进div1了。。<br /><br /><img src ="http://www.cppblog.com/yuziyu/aggbug/89565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-07-08 21:29 <a href="http://www.cppblog.com/yuziyu/archive/2009/07/08/89565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［问题解决备忘］ping不通localhost</title><link>http://www.cppblog.com/yuziyu/archive/2009/07/06/89406.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Mon, 06 Jul 2009 13:30:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/07/06/89406.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/89406.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/07/06/89406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/89406.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/89406.html</trackback:ping><description><![CDATA[今天写一个socket小程序，测试一下，居然连不上去。然后ping localhost发现ping不通，但是能上外网。<br />确实很奇怪，搜了下，后来在ubuntu论坛上发现，才想起是我的/etc/network/interfaces文件配置问题。<br />以前在手动改这个文件的时候，顺手把lo接口给删了。。。<br />难怪启动的时候x server一直报错，添加上lo接口，只/etc/init.d/networking restart还是不行的，重启马上就解决了。<br />记录一下，备忘。<br /><img src ="http://www.cppblog.com/yuziyu/aggbug/89406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-07-06 21:30 <a href="http://www.cppblog.com/yuziyu/archive/2009/07/06/89406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRM 443</title><link>http://www.cppblog.com/yuziyu/archive/2009/06/24/88416.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Wed, 24 Jun 2009 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/06/24/88416.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/88416.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/06/24/88416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/88416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/88416.html</trackback:ping><description><![CDATA[
		<br />   今天Div2前两题太简单了.可惜读第一题题目时间太长,花了12分钟才提交.第二题应该是做过最简单的Div2 Mid了.直接判断有多少个圆,使得两点分别在圆内和圆外就可以了.也花12分钟提交,速度上还是太慢了.<br />不过是有史最快的一次Div2 Mid了.最后room第4,div136.rating小涨了一点点.但要想脱离Div2看来还得几次比赛了.<br /><img src ="http://www.cppblog.com/yuziyu/aggbug/88416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-06-24 11:16 <a href="http://www.cppblog.com/yuziyu/archive/2009/06/24/88416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>郁闷的有道难题</title><link>http://www.cppblog.com/yuziyu/archive/2009/06/21/88239.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Sun, 21 Jun 2009 14:30:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/06/21/88239.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/88239.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/06/21/88239.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/88239.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/88239.html</trackback:ping><description><![CDATA[
		<br />一开始太激动了。。。还以为是Div2 的250呢。直接暴力就交了。。。<br />想想不对。。用1e17测了下，果然超时。。太脑残了今天。。<br /><br />最后重提交了。。。cha对一个，cha错一个，得了个140+，排350多名。。泪奔啊。。<br />归根结底还是自己水平不行，继续努力吧。<br /><br />贴一下最终的代码，还好过了system test，还有一点点安慰。。。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> UnrepeatingNumbers<br />              {<br />              </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">:<br />              </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> getNext(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> A)<br />                  {<br />                    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> _get(A</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />                  }<br /><br /><br />                  </span><span style="color: rgb(0, 128, 0);">/*_get()函数用于</span><span style="color: rgb(0, 128, 0);">获得&gt;=A的第一个非重复数</span><span style="color: rgb(0, 128, 0);">。<br /></span><span style="color: rgb(0, 0, 0);">                  </span><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 128, 0);">如果A是一个非重复数，直接返回。否则A必然为 xxaaXXXX形式。<br />                    其中XXXX为非重复的。也就是说我们找第一个重复数字。那<br />                     么下一个非重复数，必然大于(xxaa+1)0000。<br />                    这样就跟暴力比就大大减小了计算次数。。<br /></span><span style="color: rgb(0, 128, 0);">                  */</span><span style="color: rgb(0, 0, 0);"><br />　　　　　　　　　　<br />                  </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> _get(</span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> A){<br /><br />                    </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> t </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">;<br />                    </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">long</span><span style="color: rgb(0, 0, 0);"> res </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> A;<br />                    </span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> last </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> A</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;<br />                    A</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;<br />                    </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">( A){<br />                           </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">( A</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">last){<br />                             </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> _get((A</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">last</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">t);<br />                           }</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">{<br />                                 last </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> A</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;<br />                                 A</span><span style="color: rgb(0, 0, 0);">/=</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;<br />                                 t</span><span style="color: rgb(0, 0, 0);">*=</span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">;<br />                           }<br />                    }<br /><br />                    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> res;<br /><br />                  }<br /><br />}</span></div><br />附题：<br /><pre wrap=""><font size="2">如果一个数字十进制表达时，不存在连续两位相同，则称之为“不重复数”。例如，105、1234和12121都是“不重复数”，而11、100和<br />1225不是。<br /><br />给定一个long类型数字A，返回大于A的最小“不重复数”。<br /><br />DEFINITION<br />Class:UnrepeatingNumbers<br />Method:getNext<br />Parameters:long<br />Returns:long<br />Method signature:long getNext(long A)<br /><br /><br />CONSTRAINTS<br />-A 取值范围是[0, 10<sup class="moz-txt-sup">17</sup>]，注意是闭区间。<br /><br /><br />EXAMPLES<br /><br />0)<br />54<br /><br />Returns: 56<br /><br />大于54的最小数字是55，但55不是“不重复数”。下一个数字是56，它满足条件。<br /><br />1)<br />10<br /><br />Returns: 12<br /><br />2)<br />9<br /><br />Returns: 10<br /><br />3)<br />98<br /><br />Returns: 101<br /><br />99和100都不是“不重复数”，但101是。<br /><br />4)<br />21099</font><br /><br />Returns: 21201</pre><br /><br /><br />虽然没什么名次，但还是应该吸取一些教训吧。<br />这次的问题主要在于：<br />1.水平问题　对题目限制条件不敏感，暴力不能解决问题，至少不能解决绝大部分问题。平时做题，对1000分的题基本上不看，对难题没信心<br />2.心态问题　作为一个混迹TopCoder这么长时间的还是一个绿色的资深loser来说，在一堆红黄蓝面前，开始就没打算能进top 200。不够足够认真，谨慎，开始就没有太强的比赛意识<br /><br />教训有：<br />平时做题要和平时比赛一样，要紧张高效，不能慢慢吞吞的，加强Div2前两题的正确性和编码速度。尝试学习理解牛人代码，尝试解1000分题.写代码要争取一次编译通过，少在细节问题上犯错误。<br />比赛要全力以赴，至于结果如何并不全由自己能把握，不留遗憾，发挥出自己水平就可以了。<br /><br />今年大的比赛可能都已经结束了，纵观腾讯tic,百度之星，有道难题，都只过了初赛。这一方面，说明我的算法水平纵向地比，比以前有了很大提高，但是横向比较的话，还是处在一个比较低的水平。毕业以后可能提高算法水平的机会不太多了，争取在毕业前多做一些题，多学一些。此外，不能只顾着做题的量，不能闭门造车，要多学习牛人的代码开阔思路。<br /><br /><br /><img src ="http://www.cppblog.com/yuziyu/aggbug/88239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-06-21 22:30 <a href="http://www.cppblog.com/yuziyu/archive/2009/06/21/88239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRM442和Astar</title><link>http://www.cppblog.com/yuziyu/archive/2009/06/14/87664.html</link><dc:creator>YZY</dc:creator><author>YZY</author><pubDate>Sun, 14 Jun 2009 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/yuziyu/archive/2009/06/14/87664.html</guid><wfw:comment>http://www.cppblog.com/yuziyu/comments/87664.html</wfw:comment><comments>http://www.cppblog.com/yuziyu/archive/2009/06/14/87664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuziyu/comments/commentRss/87664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuziyu/services/trackbacks/87664.html</trackback:ping><description><![CDATA[
		<br />零点开始做SRM,很久没做了，一般都是做练习，困得不行。<br />Div2第一题居然做了17分钟，就是一个求两个数组的交集的题，想用stl的<br />set_intersection算法，结果总是不对。后来自己用map做。。。<br />第二题用了30分钟，虽然很慢，比以前还是进步了一些。<br />直接暴力会超时，cha阶段就这样cha掉两个...<br />简单的dp，存一下以前计算的，直接用某一个除数的值加1就可以了。<br /><br />astar做了七个小时，只做了两题。写得要休克了，不敢继续下去了，怕猝死。。。。<br /><a href="http://www.baiduer.com.cn/?p=14240">http://www.baiduer.com.cn/?p=14240</a><br /><br />第一题又限时间又限空间。<br />每来一个新查询，先找一下在top100中有没有，如果总数小于100则加一个新的，否则用某种替换策略替换掉一个统计量比较小的。我把第一个小于平均数的替换出去。可能时间上会超。。。。<br /><br />第三题纯工程题了。主要是输入的处理比较麻烦，先解析下html，转换成一个树。然后用一个map存这个树的所有“广义子树”。中间一个小bug调了很久：在判断两个广义子树是否相等的时候，忘了比较两个根的名字是否相同了。。。。<br />要提交的时候发现是相似度从大到小排。。。差点写反。。。<br />不过貌似把题目理解错了。<br /><br />晋级肯定是没戏的，重在参与，仰天大笑朝天去，我辈就是蓬蒿人,哈哈！<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/yuziyu/aggbug/87664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuziyu/" target="_blank">YZY</a> 2009-06-14 21:52 <a href="http://www.cppblog.com/yuziyu/archive/2009/06/14/87664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>