﻿<?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++博客-乱八七糟的代码-随笔分类-Topcoder</title><link>http://www.cppblog.com/zqsand/category/12847.html</link><description>啥是子标题</description><language>zh-cn</language><lastBuildDate>Wed, 20 Jan 2010 11:25:10 GMT</lastBuildDate><pubDate>Wed, 20 Jan 2010 11:25:10 GMT</pubDate><ttl>60</ttl><item><title>TC-Practice-Record</title><link>http://www.cppblog.com/zqsand/archive/2009/12/26/104143.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sat, 26 Dec 2009 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/12/26/104143.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/104143.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/12/26/104143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/104143.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/104143.html</trackback:ping><description><![CDATA[
<p>tchs-1 none 1000pt DFS 利用进入的方向划分四个边</p> <p>tchs-2 250pt 直接算就行 我写了2分 500pt 暴力可以过，但是判断时候不能用stringstream 用算术判断 也可以用构造法 1000pt 每一位有三种可能性</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不用，保持不动，变化，分别递归计算value并更新结果即可，由于递归深度最多只有13层所以不会tle</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外也可以写出基数为3的循环来遍历每一种情况具体看代码</p> <blockquote> <p>&nbsp;&nbsp;&nbsp; for(i=0,A[0]++;A[i]&gt;2;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[i]=0;A[i+1]++;<br>&nbsp; }</p></blockquote> <p>tchs-3 1000pt 要想使乘积最大，需要更多的3即可 500pt 又看错题了 ~~~ft 要注意题目一定要看清楚</p> <p>tchs-4 500pt 模拟题，好难懂 音乐的~ 可以都乘以16 用整数来计算 浮点会很烦~ 这种题思路要清晰 一步一步来</p><img src ="http://www.cppblog.com/zqsand/aggbug/104143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-12-26 17:28 <a href="http://www.cppblog.com/zqsand/archive/2009/12/26/104143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOPCODER-SRM455</title><link>http://www.cppblog.com/zqsand/archive/2009/12/19/103524.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sat, 19 Dec 2009 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/12/19/103524.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/103524.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/12/19/103524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/103524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/103524.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 杯具的比赛~第一题竟然把南和北写反了- -！第二题没判断好复杂度，实际上暴力方法可以的，第三题dp 必然没写出来 so----跌成灰色了~~ 250pt Problem Statement Petya likes spiders. He put a spider in each cell of a rectangular grid. He has studied spiders for many ...&nbsp;&nbsp;<a href='http://www.cppblog.com/zqsand/archive/2009/12/19/103524.html'>阅读全文</a><img src ="http://www.cppblog.com/zqsand/aggbug/103524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-12-19 14:07 <a href="http://www.cppblog.com/zqsand/archive/2009/12/19/103524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TC-SRM-454_div2</title><link>http://www.cppblog.com/zqsand/archive/2009/12/13/103088.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sun, 13 Dec 2009 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/12/13/103088.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/103088.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/12/13/103088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/103088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/103088.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 200pt( 略) 500pt Problem Statement You are playing a game with a NxN grid of letters. The goal of the game is to spell out a N-letter word somewhere on the grid either horizontally from left to right o...&nbsp;&nbsp;<a href='http://www.cppblog.com/zqsand/archive/2009/12/13/103088.html'>阅读全文</a><img src ="http://www.cppblog.com/zqsand/aggbug/103088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-12-13 10:18 <a href="http://www.cppblog.com/zqsand/archive/2009/12/13/103088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Topcoer SRM 453.5</title><link>http://www.cppblog.com/zqsand/archive/2009/12/11/103001.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Fri, 11 Dec 2009 11:59:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/12/11/103001.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/103001.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/12/11/103001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/103001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/103001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一直没写，补上上次的srm~ 250pt 500pt 队列BFS    Code Snippet  template&lt;class T&gt; void getMin(T&amp; a,T b){if(b&lt;a)a=b;} template&lt;class T&gt; void getMax(T&amp; a,T b){if(b&gt;a)a=b;}  #define REP(i, n)...&nbsp;&nbsp;<a href='http://www.cppblog.com/zqsand/archive/2009/12/11/103001.html'>阅读全文</a><img src ="http://www.cppblog.com/zqsand/aggbug/103001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-12-11 19:59 <a href="http://www.cppblog.com/zqsand/archive/2009/12/11/103001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TC-SRM-233-1000pt BFS</title><link>http://www.cppblog.com/zqsand/archive/2009/11/25/101897.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Wed, 25 Nov 2009 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/25/101897.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/101897.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/25/101897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/101897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/101897.html</trackback:ping><description><![CDATA[
<h5>继续是misof 数字教学里面的习题~ 第一篇的最后一道题了~</h5> <h5>Problem Statement</h5> <p>You are in a maze containing revolving doors. The doors can be turned 90 degrees by pushing against them in either direction. You are to find a route from the start square to the end square that involves revolving as few doors as possible. Given a map of the maze, determine the fewest number of door revolutions necessary to get from the start to the end.  </p><p>In the map:</p><pre>   ' ': empty space
   '#': wall
   'O': center of a revolving door (letter "oh", not zero)
   '-': horizontal door (always adjacent to a 'O')
   '|': vertical door (always adjacent to a 'O')
   'S': start square
   'E': end square
</pre>
<p>Each revolving door will always be oriented horizontally (with two horizontal segments) or vertically (with two vertical segments):</p><pre>    |
    O  or  -O-
    |
</pre>
<p>Doors can be revolved 90 degrees by moving onto a door segment from any of the 4 squares diagonally adjacent to the door center, i.e., the 'X' characters below:</p><pre>   X|X     X X
    O  or  -O-
   X|X     X X
</pre>
<p>Here is an example map:</p><pre>        ###
        #E#
       ## #
    ####  ##
    # S -O-#
    # ###  #
    #      #
    ########
</pre>
<p>In this example, 2 door revolutions are necessary to get from 'S' to 'E'. The first turn is shown here:</p><pre>        ###         ###
        #E#         #E#
       ## #        ## #
    ####  ##    #### |##
    # S -O-#    # S  OX#
    # ### X#    # ###| #
    #      #    #      #
    ########    ########
</pre>
<p>And the second turn is shown here:</p><pre>        ###         ###
        #E#         #E#
       ## #        ## #
    ####X|##    #### X##
    # S  O #    # S -O-#
    # ###| #    # ###  #
    #      #    #      #
    ########    ########
</pre>
<p>Your method should return an int, the minimum number of door revolutions necessary to get from the start square to the end square. If there is no way to reach the end square, return -1. 
</p><h5>Definition</h5>
<p>Class:<br>RevolvingDoors 
</p><p>Method:<br>turns 
</p><p>Parameters:<br>vector &lt;string&gt; 
</p><p>Returns:<br>int 
</p><p>Method signature:<br>int turns(vector &lt;string&gt; map) 
</p><p>(be sure your method is public) 
</p><h5>Notes</h5>
<p>-<br>Assume that all squares off the edge of the map are walls. 
</p><h5>Constraints</h5>
<p>-<br><strong>map</strong> will contain between 3 and 50 elements, inclusive. 
</p><p>-<br>Each element of <strong>map</strong> will contain between 3 and 50 characters, inclusive. 
</p><p>-<br>Each element of <strong>map</strong> will contain the same number of characters. 
</p><p>-<br>Each character in <strong>map</strong> will be one of 'S', 'E', 'O', '-', '|', '#', and ' ' (space). 
</p><p>-<br>There will be exactly one 'S' and one 'E' in <strong>map</strong>. 
</p><p>-<br>There will be between 1 and 10 doors, inclusive, and they will be formatted in <strong>map</strong> as described in the problem statement. 
</p><p>-<br>No two doors will be close enough for any part of them to occupy the same square. 
</p><p>-<br>It is not allowed for a door to be blocked and unable to turn. There will not be any walls in any of the 4 squares immediately adjacent to the center of a door, nor will a door be on the edge of the map. 
</p><h5><font face="微软雅黑" color="#c96310" size="4"><strong>关键是门的状态表示，参考了网站上的代码，挑了一个比较简练的，用的优先级队列。写完调好发现TLE 囧~ copy出网站上的再run依然TLE``` ``` 看了下发现现在的system testing 比原来增加了几个测试用例~~~&nbsp;&nbsp; 于是找出misof大牛的解法，发现对状态处理一样的~~~只不过用了memo和deque，省去了优先级队列调整的时间开销，改好了就pass了~ 上代码~~：</strong></font></h5>
<div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4e4d68e6-92fa-4ecc-8d24-3d8227bc5a06" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; ">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#d24400">using</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">namespace</span><span style="background:#373737;color:#c0c0c0"> std; </span><br>
<span style="background:#373737;color:#d24400">typedef</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">long</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">long</span><span style="background:#373737;color:#c0c0c0"> int64;&nbsp;&nbsp;</span><br>
<span style="background:#373737;color:#d24400">typedef</span><span style="background:#373737;color:#c0c0c0"> vector&lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; VI;</span><br>
<span style="background:#373737;color:#d24400">typedef</span><span style="background:#373737;color:#c0c0c0"> vector&lt;string&gt; VS;</span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> inf 1000000</span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> REP(i,n) </span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> (i)=(0);((i)&lt;(n));++(i))</span><br>
<span style="background:#373737;color:#d24400">template</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> T&gt; </span><span style="background:#373737;color:#d24400">inline</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">void</span><span style="background:#373737;color:#c0c0c0"> checkmin(T &amp;a,</span><span style="background:#373737;color:#d24400">const</span><span style="background:#373737;color:#c0c0c0"> T &amp;b) { </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0"> (b&lt;a) a=b; }</span><br>
<span style="background:#373737;color:#d24400">template</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> T&gt; </span><span style="background:#373737;color:#d24400">inline</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">void</span><span style="background:#373737;color:#c0c0c0"> checkmax(T &amp;a,</span><span style="background:#373737;color:#d24400">const</span><span style="background:#373737;color:#c0c0c0"> T &amp;b) { </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0"> (b&gt;a) a=b; } </span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> dr[]={-1,0,1,0};</span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> dc[]={0,1,0,-1};</span><br>
<span style="background:#373737;color:#d24400">struct</span><span style="background:#373737;color:#c0c0c0"> state{state(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> x,</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> y,</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> z,</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> s):r(x),c(y),doorstate(z),best(s){}</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> r;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> c;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> doorstate;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> best;};</span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> memo[56][56][1&lt;&lt;11];</span><br>
<span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> RevolvingDoors</span><br>
<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">public</span><span style="background:#373737;color:#c0c0c0">:</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> turns(vector &lt;string&gt; mp)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> x=mp.size()+2;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> y=mp[0].size()+2;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> sr,sc,er,ec,cnt=0,doorInit=0;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,x-2)mp[i]=</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">+mp[i]+</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//trick:modify the pattern to make it easy to loop </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0"> mp.insert(mp.begin(),string(58,</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">));</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">mp.push_back(string(58,</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">));</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,x)REP(j,y)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[i][j]==</span><span style="background:#373737;color:#ffc4e1">'S'</span><span style="background:#373737;color:#c0c0c0">){mp[i][j]=</span><span style="background:#373737;color:#ffc4e1">' '</span><span style="background:#373737;color:#c0c0c0">;sr=i;sc=j;}</span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[i][j]==</span><span style="background:#373737;color:#ffc4e1">'E'</span><span style="background:#373737;color:#c0c0c0">){mp[i][j]=</span><span style="background:#373737;color:#ffc4e1">' '</span><span style="background:#373737;color:#c0c0c0">;er=i;ec=j;}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,x)REP(j,y)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[i][j]==</span><span style="background:#373737;color:#ffc4e1">'O'</span><span style="background:#373737;color:#c0c0c0">){</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[i-1][j]==</span><span style="background:#373737;color:#ffc4e1">'|'</span><span style="background:#373737;color:#c0c0c0">)doorInit|=(1&lt;&lt;cnt);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">mp[i-1][j]=mp[i+1][j] = 100 + cnt*2 +1;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//use the content in the box to identify the door number,and the door pos</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0">mp[i][j-1]=mp[i][j+1] = 100 + cnt*2 ;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//if pos==0 it means this box is on the left or right of the door</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0">cnt++; mp[i][j]=</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,x)REP(j,y)REP(t,1&lt;&lt;cnt) memo[i][j][t] = inf;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//init the memo</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0"> deque&lt;state&gt; Q; Q.push_back(state(sr,sc,doorInit,0));</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">while</span><span style="background:#373737;color:#c0c0c0">(!Q.empty()){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">state now=Q.front();Q.pop_front();</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> r=now.r&nbsp;&nbsp;, c=now.c&nbsp;&nbsp;, door=now.doorstate , b=now.best; </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">( memo[r][c][door] &lt; b)</span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//no better ,no vist</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0">REP(dir,4){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//try four direction</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> nr=r+dr[dir],nc=c+dc[dir];</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[nr][nc]==</span><span style="background:#373737;color:#ffc4e1">' '</span><span style="background:#373737;color:#c0c0c0">){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(memo[nr][nc][door] &gt; b){ memo[nr][nc][door]=b;Q.push_back(state(nr,nc,door,b));}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(mp[nr][nc]==</span><span style="background:#373737;color:#ffc4e1">'#'</span><span style="background:#373737;color:#c0c0c0">)</span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//if we come to a box near to the door-mid</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> doornum=(mp[nr][nc]-100)/2;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> open=(mp[nr][nc]-100)%2;&nbsp;&nbsp;&nbsp;&nbsp;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">( ((door&gt;&gt;doornum)&amp;1) != open){&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//lucily,the box is empty </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(memo[nr][nc][door] &gt; b){memo[nr][nc][door] = b;Q.push_back(state(nr,nc,door,b));}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">// the box has a door </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(open==0 &amp;&amp; dr[dir]==0) </span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//try to define the relative pos between the direction and the box</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(open==1 &amp;&amp; dc[dir]==0) </span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//also ~ if we cannot push the door we give up</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> ndoor=door^(1&lt;&lt;doornum);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background:#373737;color:#00e300">//we can go into the box if we push the door ~</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(memo[nr][nc][ndoor] &gt; b+1 ){memo[nr][nc][ndoor] = b+1 ;Q.push_back(state(nr,nc,ndoor,b+1));}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> ans=inf;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,1&lt;&lt;cnt){ </span><span style="background:#373737;color:#00e300">//loop to check the best ans~</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(memo[er][ec][i]&lt;ans){ans=memo[er][ec][i];cout&lt;&lt;er&lt;&lt;</span><span style="background:#373737;color:#ffc4e1">" "</span><span style="background:#373737;color:#c0c0c0">&lt;&lt;ec&lt;&lt;</span><span style="background:#373737;color:#ffc4e1">" "</span><span style="background:#373737;color:#c0c0c0">&lt;&lt;hex&lt;&lt;i&lt;&lt;endl;}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(ans == inf) </span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> -1;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> ans; </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span></div>
</div>
</div>
<p> 中文copy是乱码&#183;&#183;&#183;囧啊~~ 俺的破烂英文注释啊~~~</p><img src ="http://www.cppblog.com/zqsand/aggbug/101897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-25 11:39 <a href="http://www.cppblog.com/zqsand/archive/2009/11/25/101897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCCC-05-1000pt-</title><link>http://www.cppblog.com/zqsand/archive/2009/11/23/101697.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Mon, 23 Nov 2009 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/23/101697.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/101697.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/23/101697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/101697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/101697.html</trackback:ping><description><![CDATA[
<h5><font color="#ff8040">Problem Statement</font></h5> <p><font color="#ff8040">Just before a chess match between two teams, each team's coach secretly determines an ordering of his team's players. The first players in each team then get to play against each other, the second players in each team play against each other, etc. The team with the most wins will win the match.</font> </p><p><font color="#ff8040">You are the coach for one of the teams, and you have somehow managed to find out the order of the players in the other team. Based on that, you want to order your players so that your team's expected score is maximized to your advantage. The expected score of a single game can be calculated by the following formula (which is directly derived from how the international chess rating system works):</font></p><pre><font color="#ff8040">E<sub>A</sub> = 1 / (1 + 10 <sup>(R<sub>B</sub> - R<sub>A</sub>)/400</sup>)

E<sub>B</sub> = 1 / (1 + 10 <sup>(R<sub>A</sub> - R<sub>B</sub>)/400</sup>)
</font></pre>
<p><font color="#ff8040">where R<sub>A</sub> and R<sub>B</sub> are the ratings of player A and B, and E<sub>A</sub> and E<sub>B</sub> are the expected scores for each player. For instance, if R<sub>A</sub> is 2432 and R<sub>B</sub> is 2611, the expected score for player A is 1 / (1 + 10<sup>179/400</sup>) = 0.263005239459. The expected score for a team is the sum of the expected scores for the players in that team.</font>
</p><p><font color="#ff8040">To make things a bit more complicated, the players in a team must be ordered such that a player with rating <em>x</em> plays before all players with rating strictly less than <em>x</em> - <strong>lim</strong>, where <strong>lim</strong> is a given non-negative integer. For example, if <strong>lim</strong> is 100, a player with rating 2437 must play before a player with rating 2336 but not necessarily before a player with rating 2337.</font>
</p><p><font color="#ff8040">Create a class ChessMatch containing the method bestExpectedScore which takes a vector &lt;int&gt; <strong>teamA</strong>, the ratings of your players (in no particular order); a vector &lt;int&gt; <strong>teamB</strong>, the ratings of your opponent's players in the order they will play; and an int <strong>lim</strong>, the limit determining how freely you can order your players. You can assume that your opponent's players will be ordered in accordance with <strong>lim</strong>. The method should return a double, your team's expected score if you order your players optimally.</font>
</p><h5><font color="#ff8040">Definition</font></h5>
<p><font color="#ff8040">Class:<br>ChessMatch</font>
</p><p><font color="#ff8040">Method:<br>bestExpectedScore</font>
</p><p><font color="#ff8040">Parameters:<br>vector &lt;int&gt;, vector &lt;int&gt;, int</font>
</p><p><font color="#ff8040">Returns:<br>double</font>
</p><p><font color="#ff8040">Method signature:<br>double bestExpectedScore(vector &lt;int&gt; teamA, vector &lt;int&gt; teamB, int lim)</font>
</p><p><font color="#ff8040">(be sure your method is public)</font>
</p><p><font face="宋体" color="#00ff00" size="3"></font>&nbsp; </p><p><font face="宋体" color="#00ff00" size="3">要求最好的得分，要遍历所有的排列方式显然不可能。如果转化问题为依次放置每个选手到每一个位置，那么只要求出剩下选手排列中使得得分最大的就可以了，可以想到dp方法的最有子问题定义。</font>
</p><p><font face="宋体" color="#00ff00" size="3">用每一位记录当前的选手分配情况，如果为0，则已经分配，如果为1，则还未分配。pos来记录当前要分配的位置。对于每一个子集，考虑每一个为1的也就是未分配的选手使位于pos位置，然后check 是否满足在他之后的球员（也就是剩下的是1的位）是否满足条件的不等式，满足则更新当前分配的最优成绩。最终 2^N-1 的成绩即为所求。</font>
</p><p>
</p><div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:61aab5d0-eda5-4945-abce-9af60642a7cd" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; ">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> REP(i, n) </span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0"> (</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> i = 0; i &lt; (n); ++i) </span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> two(X) (1&lt;&lt;(X))</span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> contain(S,X) ((S&amp;two(X))&gt;0)</span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> eps 1e-9</span><br>
<span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> p[20][20];</span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> N;</span><br>
<span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> memo[1&lt;&lt;20]; </span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> lim;VI A;</span><br>
<span style="background:#373737;color:#d24400">bool</span><span style="background:#373737;color:#c0c0c0"> check(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> now,</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> pos){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,N)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(now&amp;two(i)){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(A[pos]+lim&lt;A[i])</span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">false</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">true</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#c0c0c0">}</span><br>
<span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> solve(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> now,</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> pos){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(now==0) </span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> 0;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(memo[now]&gt;-eps)</span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> memo[now];</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,N) </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(now,i)&amp;&amp;check(now^two(i),i)){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> tmp=p[i][pos]+solve(now^two(i),pos+1); </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(tmp&gt;memo[now]+eps) memo[now]=tmp;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> memo[now];</span><br>
<span style="background:#373737;color:#c0c0c0">}</span><br>
<br>
<span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> ChessMatch</span><br>
<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">public</span><span style="background:#373737;color:#c0c0c0">:</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> bestExpectedScore(vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; tA, vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; tB, </span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> _lim)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">N=tA.size(); lim=_lim;A=tA;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,N)REP(j,N)&nbsp;&nbsp;p[i][j]=1.0/(1.0+pow(10.0,</span><span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0">(tB[j]-tA[i])/400.0));</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,1&lt;&lt;N)memo[i]=-1;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> solve(two(N)-1,0);&nbsp;&nbsp;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span></div>
</div>
</div><p>&#160;</p>
<p><font face="幼圆" color="#0c91f3" size="3">上面的方法使用递归，下面是使用递推的程序。即从子集出发最终到达2^n-1的思路。在这里把A队伍先从大到小排序。在每一个子集记录每一个未分配选手的得分和要分配的位置。</font></p>
<p><font face="幼圆" color="#0c91f3" size="3">程序中思路为：依次从子集中选取一个选手作为第bits-1个选手，也就是说子集中剩下的元素要放在这个选手前面，由于选手从小到大遍历，只需要遍历到s[j]&lt;=s[bits-1]+lim 为止，也就说满足这个子集中最小的选手+lim &gt;=选中的 即可，然后更新当前子集的得分</font></p>
<p><font face="幼圆" color="#0c91f3" size="3">注释中思路为: 依次从子集选取一个选手作为当前子集中的第一个元素，也就是整体的第n-bits个元素，这次从大到小遍历，这样只需要保证，位于子集第一个的元素+lim&gt;=子集中最大的元素(s[0])，即可，然后更新当前子集得分</font></p>
<p><font face="幼圆" color="#0c91f3" size="3">最终全集2^n-1的即为所求</font></p>
<div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2531c02e-af97-43d3-9a16-08477d4ebda6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; ">
<div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div>
<div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> ChessMatch</span><br>
<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">public</span><span style="background:#373737;color:#c0c0c0">:</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0"> bestExpectedScore(vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; ta, vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; tb, </span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> _lim)</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">{ </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> n=ta.size();a=ta;lim=_lim;N=n;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">sort(ta.begin(),ta.end(),greater&lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt;());</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> s[32],pos[32];</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,n)REP(j,n)p[i][j]=1./(1.+pow(10.,</span><span style="background:#373737;color:#d24400">double</span><span style="background:#373737;color:#c0c0c0">(tb[j]-ta[i])/400.));</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(mask,1&lt;&lt;n){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> bits=0;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">dp[mask]=0.;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(!mask)</span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,n) </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(mask,i)){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">s[bits]=ta[i];pos[bits++]=i;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#00e300">//for (int j = 0 ; j &lt; bits&nbsp;&nbsp;&amp;&amp; s[j] + lim &gt;= s[0]; j++){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#00e300">//&nbsp;&nbsp;&nbsp;&nbsp;if(dp[mask] &lt; p[pos[j]][n-bits]+dp[mask^two(pos[j])]) </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#00e300">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp[mask]= p[pos[j]][n-bits]+dp[mask^two(pos[j])] ;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0"> (</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> j = bits-1; j &gt;= 0 &amp;&amp; s[j] &lt;= s[bits-1] + lim; j--){</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(&nbsp;&nbsp;&nbsp;&nbsp;dp[mask] &lt;&nbsp;&nbsp;p[pos[j]][bits-1] + dp[mask &amp; ~(1 &lt;&lt; pos[j])] )</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">dp[mask] = p[pos[j]][bits-1] + dp[mask &amp; ~(1 &lt;&lt; pos[j])];</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> dp[two(n)-1];</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span></div>
</div>
</div><img src ="http://www.cppblog.com/zqsand/aggbug/101697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-23 15:29 <a href="http://www.cppblog.com/zqsand/archive/2009/11/23/101697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TC-05TCOR4-250 DP</title><link>http://www.cppblog.com/zqsand/archive/2009/11/22/101628.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sun, 22 Nov 2009 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/22/101628.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/101628.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/22/101628.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/101628.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/101628.html</trackback:ping><description><![CDATA[
<blockquote> <h5>roblem Statement</h5> <p>Character j in element i (both 0-based) of <strong>messages</strong> denotes how many messages employee i sent to employee j. You will return a vector &lt;int&gt; containing the hierarchy of the employees within the company. Element 0 is the highest ranked employee, and so forth. The returned ranking should minimize the number of messages sent from lower ranked employees to higher ranked employees. If multiple solutions are possible, return the one with element 0 minimal. If there are still ties, minimize element 1, etc. </p><h5>Definition</h5> <p>Class:<br>CompanyMessages </p><p>Method:<br>getRank </p><p>Parameters:<br>vector &lt;string&gt; </p><p>Returns:<br>vector &lt;int&gt; </p><p>Method signature:<br>vector &lt;int&gt; getRank(vector &lt;string&gt; messages) </p><p>(be sure your method is public) </p><h5>Constraints</h5> <p>-<br><strong>messages</strong> will contain between 2 and 15 elements inclusive. </p><p>-<br>Each element of <strong>messages</strong> will contain exactly N characters, where N is the number of elements in <strong>messages</strong>. </p><p>-<br>Each character in <strong>messages</strong> will be a digit ('0'-'9'). </p><p>-<br>Character i in element i of <strong>messages</strong> will be '0'. </p><p><font face="微软雅黑" color="#008000" size="3">按照题目说明可知，按照找到的顺序，所有从低级向高级发的信得数目和应该是最小的。又观察到，只要确定了第一个，也就是级别最高的boss，那么剩下的员工怎么排列，他们向最高boss 发信数是不变的，从而子问题就是在剩下员工中找到 低级向高级发信数最小的排列 ，显然这符合DP问题最优子结构的问题。</font></p> <p><font face="微软雅黑" color="#008000" size="3">T[1&#183;&#183;&#183;N]=Min{sum(N &lt;-&gt;{1-N-1},T[1-N-1] } 得到状态方程后很容易写出程序 ，可以使用备忘录dp</font></p> <p> </p><div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b24fef26-5cf8-4ec6-add7-931a29c5a271" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"> <div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; "> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> REP(i, n) </span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0"> (</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> i = 0; i &lt; (n); ++i) </span><br> <span style="background:#373737;color:#c0c0c0"> </span><br> <span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> two(X) (1&lt;&lt;(X))</span><br> <span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> contain(S,X) ((S&amp;two(X))&gt;0)</span><br> <br> <span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> A[1&lt;&lt;15];</span><br> <span style="background:#373737;color:#c0c0c0">vector&lt;vector&lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; &gt; vec(1&lt;&lt;15);</span><br> <span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> CompanyMessages</span><br> <span style="background:#373737;color:#c0c0c0">{</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">public</span><span style="background:#373737;color:#c0c0c0">:</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; getRank(vector &lt;string&gt; mes )</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">{</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> n=mes.size();</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(mask,two(n)){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(!mask)</span><span style="background:#373737;color:#d24400">continue</span><span style="background:#373737;color:#c0c0c0">;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">A[mask]=100000;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,n)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(mask,i)){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> now=mask^two(i); </span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> tmp=A[now];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(j,n)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(now,j))tmp+=(mes[j][i]-</span><span style="background:#373737;color:#ffc4e1">'0'</span><span style="background:#373737;color:#c0c0c0">);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(tmp&lt;A[mask]){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">vec[mask].clear();vec[mask].push_back(i);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> s=0;s&lt;vec[now].size();s++)vec[mask].push_back(vec[now][s]);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">A[mask]=tmp;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> vec[two(n)-1];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span></div> </div> </div><p>&#160;</p> <div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b373582f-0a3d-4b6f-b009-72e7fb21765f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"> <div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; "> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> memo[two(15)],record[two(15)];</span><br> <span style="background:#373737;color:#c0c0c0">VS M;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> N;VI ans;</span><br> <span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> solve(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> now){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">( now == 0 ) </span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> 0;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">( memo[now]&gt;=0 )</span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> memo[now];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">memo[now] = 100000;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,N)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(now,i)){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> mask = now ^ two(i);</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> tmp = solve(mask);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(j,N)</span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(contain(mask,j))tmp += (M[j][i] - </span><span style="background:#373737;color:#ffc4e1">'0'</span><span style="background:#373737;color:#c0c0c0">); </span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(tmp &lt; memo[now]) { </span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">memo[now]=tmp ; </span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">record[now] = mask; </span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> memo[now];</span><br> <span style="background:#373737;color:#c0c0c0">}</span><br> <span style="background:#373737;color:#d24400">void</span><span style="background:#373737;color:#c0c0c0"> cacl(){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> mask = two(N)-1;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">ans.clear();</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">REP(i,N){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> k = mask ^ record[mask];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> cnt = -1; </span><span style="background:#373737;color:#d24400">while</span><span style="background:#373737;color:#c0c0c0">(k&gt;0){k&gt;&gt;=1;cnt++;}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">ans.push_back(cnt);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">mask=record[mask];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> <span style="background:#373737;color:#c0c0c0">}</span><br> <span style="background:#373737;color:#d24400">class</span><span style="background:#373737;color:#c0c0c0"> CompanyMessages</span><br> <span style="background:#373737;color:#c0c0c0">{</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">public</span><span style="background:#373737;color:#c0c0c0">:</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; getRank(vector &lt;string&gt; mes)</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">{</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">M=mes;N=mes.size();</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">memset(memo,-1,</span><span style="background:#373737;color:#d24400">sizeof</span><span style="background:#373737;color:#c0c0c0">(memo));</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">solve(two(N)-1);</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">cacl();</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> ans;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span></div> </div> </div></blockquote><img src ="http://www.cppblog.com/zqsand/aggbug/101628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-22 15:58 <a href="http://www.cppblog.com/zqsand/archive/2009/11/22/101628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRM 453 div2</title><link>http://www.cppblog.com/zqsand/archive/2009/11/18/101316.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Wed, 18 Nov 2009 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/18/101316.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/101316.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/18/101316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/101316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/101316.html</trackback:ping><description><![CDATA[
<p><font face="微软雅黑" color="#804040" size="3">半夜12：00的比赛，开始就发现系统很慢，结果第一题没法提交，然后退出重进退出重进&#183;&#183;&#183;&#183;&#183;server down&#183;&#183;&#183;&#183;&#183;</font></p> <p><font face="微软雅黑" color="#804040" size="3">想起洗的衣服还没拿，于是跑下去取衣服，看了会dota vod ，重新登入，比赛竟然继续&#183;&#183;&#183;&#183;&#183;交了500 开始看1000 没思路，冻死了。</font></p> <p><font face="微软雅黑" color="#804040" size="3">challenge没啥意思，都没人在，250的太弱智都对的&#183;&#183;&#183;&#183;由于中间出错，这次srm not rated~~</font></p> <p><font face="微软雅黑" color="#804040" size="3">250 pt 略过</font></p> <p><font face="微软雅黑" color="#804040" size="3">500 pt </font></p> <p>John and Brus have an interest in team sports tournaments. They are currently investigating a basketball tournament. Basketball is a team sport in which two teams of five players try to score points against one another by placing a ball through a ten foot high hoop. Basketball is one of the most popular and widely viewed sports in the world.  </p><p>There are <strong>n</strong> teams in the tournament. Each pair of teams plays exactly two games against each other. In the first of these games, one of the teams is the host, and in the second, the other team is the host. Each game results in one team winning. There are no draws. After the tournament is over, the team with the highest total number of wins is crowned the winner.  </p><p>The tournament is currently in progress and the current results are described in the vector &lt;string&gt; <strong>table</strong>. For each pair of distinct indices, i and j, the j-th character of the i-th element of <strong>table</strong>is the result of the game where team i hosted team j. The result is 'W' if team i won, 'L' if team i lost, and '?' if the game hasn't been played yet. Assuming that every possible outcome is possible for the games that haven't been played yet, return the minimal number of total wins the tournament winner can have at the end of the tournament.  </p><h5>Definition</h5> <p>Class:<br>TheBasketballDivTwo  </p><p>Method:<br>find  </p><p>Parameters:<br>vector &lt;string&gt;  </p><p>Returns:<br>int  </p><p>Method signature:<br>int find(vector &lt;string&gt; table)  </p><p>(be sure your method is public)  </p><h5>Constraints</h5> <p>-<br><strong>table</strong> will contain between 2 and 5 elements, inclusive.  </p><p>-<br>Each element of <strong>table</strong> will contain exactly n characters, where n is the number of elements in <strong>table</strong>.  </p><p>-<br>The j-th character of the i-th element of table, where i and j are different, will be 'W', 'L', or '?'.  </p><p>-<br>The i-th character of the i-th element of <strong>table</strong> will be 'X'.  </p><p>&nbsp;</p> <p><font face="微软雅黑" color="#804040" size="3">数据量很小，找到未比的比赛场次 ，然后枚举各种输赢情况，更新解就可以了。或者循环2^n次，或者递归调用</font></p> <p><font face="微软雅黑" color="#804040" size="3">1000 pt</font></p> <p>n this tournament, each game results in either a victory for one team or a draw. If a team wins a game, it gains three points and its opponent gains no points. In case of a draw, each team gains one point. The score of a team is the sum of all the points it has gained from all its games. Each pair of teams can play against each other any number of times.  </p><p>You are given a vector &lt;int&gt; <strong>points</strong> representing the current standings in the tournament. The i-th element of <strong>points</strong> is the score of the i-th team. You can assume that the <strong>points</strong> represent a valid state, i.e., intermediate standings that can be achieved in a tournament according to the rules described above.  </p><p>Each team will play exactly one more game in the tournament, but it is not known what the matchups will be. After the tournament is over, the teams will be ranked by score. 1st place will go to the team with the highest score, 2nd place will go to the team with the second highest score, and so on. If two teams have the same score, the team with the lower number will place higher. For example, if team 0 and team 3 each have the highest score of 100 points, then team 0 will place 1st and team 3 will place 2nd.  </p><p>John's favorite team is team 0, and he wants it to place as high as possible. Assuming that the remaining games can be scheduled arbitrarily and can end with any possible outcome, return the highest possible place for team 0 at the end of the tournament.  </p><h5>Definition</h5> <p>Class:<br>TheSoccerDivTwo  </p><p>Method:<br>find  </p><p>Parameters:<br>vector &lt;int&gt;  </p><p>Returns:<br>int  </p><p>Method signature:<br>int find(vector &lt;int&gt; points)  </p><p>(be sure your method is public)  </p><h5>Constraints</h5> <p>-<br><strong>points</strong> will contain between 2 and 50 elements, inclusive.  </p><p>-<br><strong>points</strong> will contain an even number of elements.  </p><p>-<br>Each element of <strong>points</strong> will be between 0 and 1,000,000, inclusive.  </p><p>-<br><strong>points</strong> will represent a valid state.  </p><h5>Examples</h5> <p> </p><div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:16300168-3186-402b-ace8-a7cc6f50fb46" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"> <div style="border-left-color: rgb(0, 0, 128); color: rgb(0, 0, 0); font-family: 'Courier New', Courier, monospace; font-size: 10pt; "> <div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px">Code Snippet</div> <div style="background-color: #353535; max-height: 500px; overflow: auto; padding: 2px 5px; white-space: nowrap"><span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> find(vector &lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; p )</span><br> <span style="background:#373737;color:#c0c0c0">{</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> E3=0,A3=0,L3=0,L=0;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> d=p[0];</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> i=1;i&lt;p.size();i++){</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(p[i]&gt;d+3)A3++;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(p[i]==d+3)E3++;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0"> (p[i]&gt;d)L3++;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">else</span><span style="background:#373737;color:#c0c0c0"> L++;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0">}</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">if</span><span style="background:#373737;color:#c0c0c0">(A3+L+1&gt;=E3)</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> A3+1;</span><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#d24400">return</span><span style="background:#373737;color:#c0c0c0"> A3+1+(E3-A3-L)/2;</span><br> <span style="background:#373737;color:#c0c0c0">}</span></div> </div> </div><p>&#160;</p> <p>&#160;</p> <p>&#160;</p> <p><font face="微软雅黑" color="#804040" size="3">因为每队只剩下一场比赛，所以题目变得很简单。0队最后一轮肯定是取到3分，比0队多3场以上比赛的 肯定比0队靠前，比0队分少或者相等的一定在0队之后，剩下的就是我们要考虑的了。如果A3+L+1&gt;=E3 也就是说比0队多胜一场的队伍，如果让他们在最后一轮都输，那么0队可以获得最好成绩 A3+1;</font></p> <p><font face="微软雅黑" color="#804040" size="3">然而如果不行剩下的这些E3要有一半(E3+1)/2个要得到3分从而比0队高，over~</font></p><img src ="http://www.cppblog.com/zqsand/aggbug/101316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-18 15:24 <a href="http://www.cppblog.com/zqsand/archive/2009/11/18/101316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>并查集</title><link>http://www.cppblog.com/zqsand/archive/2009/11/12/100838.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Thu, 12 Nov 2009 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/12/100838.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/100838.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/12/100838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/100838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/100838.html</trackback:ping><description><![CDATA[

<p><strong>昨天看了sedgewick的alg in c 的第一章，主要介绍了个find-union 判断联通的算法，其实用到了并查集的知识</strong></p> <p><strong>刚才偶然看见poj并查集的题集 就copy过来自己也写写看~~&#183;</strong></p> <p><strong>慢慢来~~ 写完一道上一道~~</strong></p> <p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POJ 1182 食物链</strong><br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1182">http://acm.pku.edu.cn/JudgeOnline/problem?id=1182</a></p> <p><font face="微软雅黑" color="#83c13e" size="4">还以为是最简单的一道呢，被列在最前面，原来是扩展的应用，不是那么直接啊~</font></p> <p><font face="微软雅黑" color="#83c13e" size="4">纠结了一会儿，看了解题报告才有思路。关键是在并查集的基础上增加一个数组，维护其与根节点的关系；</font></p> <p><font face="微软雅黑" color="#83c13e" size="4">详情写到注释里面吧：</font></p><pre class="code"><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">A[</span><span style="background: #2b2b2b; color: #ff8080">100003</span><span style="background: #2b2b2b; color: white">][</span><span style="background: #2b2b2b; color: #ff8080">3</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">];
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">root[</span><span style="background: #2b2b2b; color: #ff8080">50005</span><span style="background: #2b2b2b; color: white">],k[</span><span style="background: #2b2b2b; color: #ff8080">50005</span><span style="background: #2b2b2b; color: white">];</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">//root记录节点所属于的树木id k记录节点与根的关系0 同类1子是食物2子是天敌
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">sz[</span><span style="background: #2b2b2b; color: #ff8080">50005</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">];
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">find(</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">x){
    </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(root[x]==x)</span><span style="background: #2b2b2b; color: #0080ff">return </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">x;//如果是根则返回
     </span><span style="background: #2b2b2b; color: #0080ff">else if</span><span style="background: #2b2b2b; color: white">(root[root[x]]==root[x])</span><span style="background: #2b2b2b; color: #0080ff">return </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">root[x];//如果第一层，则返回
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">father=root[x];
    root[x]=find(father);//放到第一层，减少下次find时间，减小树的高度
    k[x]=(k[x]+k[father])%</span><span style="background: #2b2b2b; color: #ff8080">3</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;//由自己与根的关系以及父节点与根的关系推断出新的自己与根的关系，实际上是为了解决union后的节点与根的关系</span></font></font></pre><pre class="code"><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">                                            //因为union后，非根节点并没有更新k，因此需要在此处处理更新
    </span><span style="background: #2b2b2b; color: #0080ff">return </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">root[x];
}
</span><span style="background: #2b2b2b; color: #0080ff">inline void </span><span style="background: #2b2b2b; color: white">Union(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">x,</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">y,</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">kind){
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">a=find(x);</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><span style="background: #2b2b2b; color: white"><font face="Comic Sans MS" size="2">b=find(y);
 </font></span><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">    </span><span style="background: #2b2b2b; color: #0080ff">if</span></font></font><span style="background: #2b2b2b; color: white"><font face="Comic Sans MS" size="2">(sz[a]&gt;sz[b]){//判断后决定，要把size小的放到size大的上去，优化作用不大
    root[b]=a ; </font></span><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">//b成为a的子树
    </span><span style="background: #2b2b2b; color: white">k[b]=(k[x]-k[y]+kind+</span><span style="background: #2b2b2b; color: #ff8080">3</span><span style="background: #2b2b2b; color: white">)%</span><span style="background: #2b2b2b; color: #ff8080">3</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;//要把b变成a的子树，从a出发，到x，经过kind，到y，再到b ，可以得到kb的状态改变公式
    sz[a]+=sz[b];}
    </span><span style="background: #2b2b2b; color: #0080ff">else</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">{
        </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(kind==</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">)kind=</span><span style="background: #2b2b2b; color: #ff8080">2</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
        root[a]=b;
        k[a]=(k[y]-k[x]+kind+</span><span style="background: #2b2b2b; color: #ff8080">3</span><span style="background: #2b2b2b; color: white">)%</span><span style="background: #2b2b2b; color: #ff8080">3</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
        sz[b]+=sz[a];
    }
}
</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">main()
{
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">N,d;
    freopen(</span><span style="background: #2b2b2b; color: #ff8000">"d:\\input.txt"</span><span style="background: #2b2b2b; color: white">,</span><span style="background: #2b2b2b; color: #ff8000">"r"</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,stdin);
    scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d"</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,&amp;N,&amp;d);
    </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">;i&lt;=N;i++)sz[i]=</span><span style="background: #2b2b2b; color: #ff8080">1</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">cnt=</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
     </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">s=</span><span style="background: #2b2b2b; color: #ff8080">1</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;s&lt;=N;s++)root[s]=s;
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">LIE=</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
    </span><span style="background: #2b2b2b; color: #0080ff">while</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">(i !=d) {
        scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d %d"</span><span style="background: #2b2b2b; color: white">,&amp;A[i][</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">],&amp;A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">],&amp;A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">]); 
        </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]&gt;N || A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">]&gt;N ) {LIE++;i++;</span><span style="background: #2b2b2b; color: #0080ff">continue</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;}
        </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(A[i][</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">]==</span><span style="background: #2b2b2b; color: #ff8080">1</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">){
            </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(find(A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]) == find(A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">])){
                </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(k[A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]]!=k[A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">]]) LIE++;
            }
            </span><span style="background: #2b2b2b; color: #0080ff">else   </span><span style="background: #2b2b2b; color: white">Union(A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">],A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">],</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">); 
         }
        </span><span style="background: #2b2b2b; color: #0080ff">else</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">{
            </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">( find(A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">])==find(A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">]) ){</span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(k[A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">]] != ( k[A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]]+</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">)%</span><span style="background: #2b2b2b; color: #ff8080">3</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">)LIE++;}
            </span><span style="background: #2b2b2b; color: #0080ff">else  </span><span style="background: #2b2b2b; color: white">Union(A[i][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">],A[i][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">],</span><span style="background: #2b2b2b; color: #ff8080">1</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">); 
        }
    i++;
    }
    cout&lt;&lt;LIE&lt;&lt;endl;
    </span><span style="background: #2b2b2b; color: #0080ff">return </span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><span style="background: #2b2b2b; color: white"><font face="Comic Sans MS" size="2">;
}</font></span></pre><a href="http://11011.net/software/vspaste"></a><strong>POJ 1611 The Suspects</strong><br>
<p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1611">http://acm.pku.edu.cn/JudgeOnline/problem?id=1611</a></p>
<p><br></p><pre class="code"><span style="background: #2b2b2b; color: white"> </span><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">G[</span><span style="background: #2b2b2b; color: #ff8080">30005</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">];
 </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">sz[</span><span style="background: #2b2b2b; color: #ff8080">30005</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">];
 </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">Find(</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">x){
    </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(G[x]==x)</span><span style="background: #2b2b2b; color: #0080ff">return </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">x;
    </span><span style="background: #2b2b2b; color: #0080ff">else </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">{
        </span><span style="background: #2b2b2b; color: #0080ff">while</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">(G[x]!=x){//half路径压缩~等下试试看全压缩的效率~那样就是递归调用啦
            </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">t=G[x];
            G[x]=G[t];
            x=t;
        }
        </span><span style="background: #2b2b2b; color: #0080ff">return </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">x;
    }
 }
 </span><span style="background: #2b2b2b; color: #0080ff">void </span><span style="background: #2b2b2b; color: white">Union(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">x,</span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">y){
    </span><span style="background: #2b2b2b; color: #0080ff">if</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">(sz[x]&lt;sz[y])swap(x,y);//把size小的弄到大的上面
    G[y]=x;
    sz[x]+=sz[y];
 }
   </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">main()
{
    freopen(</span><span style="background: #2b2b2b; color: #ff8000">"d:\\input.txt"</span><span style="background: #2b2b2b; color: white">,</span><span style="background: #2b2b2b; color: #ff8000">"r"</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,stdin);
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">N,M,num;
    </span><span style="background: #2b2b2b; color: #0080ff">while</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">true</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">){
        scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d"</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,&amp;N,&amp;M);
        </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(N==</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">&amp;&amp;M==</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">)</span><span style="background: #2b2b2b; color: #0080ff">return </span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
        </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">;i&lt;N;i++)G[i]=i,sz[i]=</span><span style="background: #2b2b2b; color: #ff8080">1</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;
        </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;i&lt;M;i++){
            scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d"</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,&amp;num);
            </span><span style="background: #2b2b2b; color: #0080ff">int </span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">root,stu,x,y;
            </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">j=</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">;j&lt;num;j++){
                scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d"</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,&amp;stu);
                </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(j==</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">)root=Find(stu);//简单的都和第一个合并
                </span><span style="background: #2b2b2b; color: #0080ff">else</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">{
                    root=Find(root);
                    x=Find(stu);</span><span style="background: #2b2b2b; color: #0080ff">if</span></font></font><font size="4"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">(root!=x)Union(root,x);
                }
            }
        }
        printf(</span><span style="background: #2b2b2b; color: #ff8000">"%d\n"</span><span style="background: #2b2b2b; color: white">,sz[Find(</span><span style="background: #2b2b2b; color: #ff8080">0</span></font></font><span style="background: #2b2b2b; color: white"><font face="Comic Sans MS" size="4">)]);
    }
}</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a><strong>POJ 2524 Ubiquitous Religions</strong></p>
<p><strong>又一道水题~~ 呵呵&nbsp; </strong></p>
<p><strong>不贴代码了 和上面一道基本一样~</strong><br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2524">http://acm.pku.edu.cn/JudgeOnline/problem?id=2524</a></p>
<p><font size="2"><strong>POJ 1861</strong></font></p>
<p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1861">http://acm.pku.edu.cn/JudgeOnline/problem?id=1861</a></p>
<p><font size="2"><strong>kruskal+并查集+half路径压缩</strong></font></p>
<p><strong><font size="2">比较基础的题</font></strong></p><pre class="code"><span style="background: #2b2b2b; color: #0080ff"><font face="Comic Sans MS" size="4"><em>struct </em></font></span><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">Edge{
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">from;
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">to;
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">value;
}E[</span><span style="background: #2b2b2b; color: #ff8080">15000</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">];
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">A[</span><span style="background: #2b2b2b; color: #ff8080">1005</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">]; 
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">sz[</span><span style="background: #2b2b2b; color: #ff8080">2009</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">];
</span><span style="background: #2b2b2b; color: #0080ff">bool </span><span style="background: #2b2b2b; color: white">comp(</span><span style="background: #2b2b2b; color: #0080ff">const </span><span style="background: #2b2b2b; color: white">Edge&amp; a,</span><span style="background: #2b2b2b; color: #0080ff">const </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">Edge&amp; b){
    </span><span style="background: #2b2b2b; color: #0080ff">return </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">a.value&lt;b.value;
}
</span><span style="background: #2b2b2b; color: #0080ff">using namespace </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">std; 
</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">Find(</span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">x){
    </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(A[x]==x)</span><span style="background: #2b2b2b; color: #0080ff">return </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">x;
    </span><span style="background: #2b2b2b; color: #0080ff">else if</span><span style="background: #2b2b2b; color: white">(A[A[x]]==A[x]) </span><span style="background: #2b2b2b; color: #0080ff">return </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">A[x];
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">father;
    </span><span style="background: #2b2b2b; color: #0080ff">while</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">(A[x]!=x){
        father=A[x];
        A[x]=A[father];//把每一个路过的节点放到祖父下面去
        x=father;
    }
    </span><span style="background: #2b2b2b; color: #0080ff">return </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">x;
}
</span><span style="background: #2b2b2b; color: #0080ff">void </span><span style="background: #2b2b2b; color: white">Union(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">x,</span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">y){
    </span><span style="background: #2b2b2b; color: #0080ff">if</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">(sz[y]&gt;sz[x])swap(x,y);//小的放到大的下面
    sz[x]+=sz[y]; 
    A[y]=x;    
}
   </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">main()
{
    freopen(</span><span style="background: #2b2b2b; color: #ff8000">"d:\\input.txt"</span><span style="background: #2b2b2b; color: white">,</span><span style="background: #2b2b2b; color: #ff8000">"r"</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">,stdin);
    </span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">N,M,num,x,y;
    scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d"</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">,&amp;N,&amp;M);
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">cnt=</span><span style="background: #2b2b2b; color: #ff8080">0</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">;
    </span><span style="background: #2b2b2b; color: #0080ff">while</span><span style="background: #2b2b2b; color: white">(cnt&lt;M)  scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d %d"</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">,&amp;E[cnt].from,&amp;E[cnt].to,&amp;E[cnt].value),cnt++;
    sort(E,E+M,comp);//从小到大选n-1条边，如果起点和终点在一个集合则continue；else Union
    </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">;i&lt;=N;i++)sz[i]=</span><span style="background: #2b2b2b; color: #ff8080">1</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">,A[i]=i;
    vector&lt;</span><span style="background: #2b2b2b; color: #0080ff">int</span><span style="background: #2b2b2b; color: white">&gt; ans(N-</span><span style="background: #2b2b2b; color: #ff8080">1</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">);
    </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">mst=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">,MX=</span><span style="background: #2b2b2b; color: #ff8080">0</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">;
    </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">;mst!=N-</span><span style="background: #2b2b2b; color: #ff8080">1</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">;i++){
        </span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">x=Find(E[i].from);</span><span style="background: #2b2b2b; color: #0080ff">int </span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">y=Find(E[i].to);
        </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(x==y)</span><span style="background: #2b2b2b; color: #0080ff">continue</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">;
        Union(x,y);
        ans[mst]=i;
        mst++;
        </span><span style="background: #2b2b2b; color: #0080ff">if</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">(E[i].value&gt;MX)MX=E[i].value;
    }
    printf(</span><span style="background: #2b2b2b; color: #ff8000">"%d\n%d\n"</span><span style="background: #2b2b2b; color: white">,MX,N-</span><span style="background: #2b2b2b; color: #ff8080">1</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">);
    </span><span style="background: #2b2b2b; color: #0080ff">for</span><span style="background: #2b2b2b; color: white">(</span><span style="background: #2b2b2b; color: #0080ff">int </span><span style="background: #2b2b2b; color: white">i=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">;i&lt;N-</span><span style="background: #2b2b2b; color: #ff8080">1</span></em></font></font><font size="4"><font face="Comic Sans MS"><em><span style="background: #2b2b2b; color: white">;i++)
        printf(</span><span style="background: #2b2b2b; color: #ff8000">"%d %d\n"</span></em></font></font><span style="background: #2b2b2b; color: white"><font face="Comic Sans MS" size="4"><em>,E[ans[i]].from,E[ans[i]].to);
}</em></font></span></pre><a href="http://11011.net/software/vspaste"></a>
<p><br>&nbsp;<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POJ 1456 Supermarket</strong><br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1456">http://acm.pku.edu.cn/JudgeOnline/problem?id=1456</a><br>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POJ 1733 Parity game</strong><br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1733">http://acm.pku.edu.cn/JudgeOnline/problem?id=1733</a><br>&nbsp; </p><p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdu 3038 How Many Answers Are Wrong</strong><br><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3038">http://acm.hdu.edu.cn/showproblem.php?pid=3038</a><br>&nbsp; </p><p><strong>&nbsp;&nbsp;&nbsp;&nbsp; POJ 1417 True Liars(难)</strong><br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1417">http://acm.pku.edu.cn/JudgeOnline/problem?id=1417</a><br>&nbsp; </p><p><strong>&nbsp;&nbsp; POJ 2912 Rochambeau(难)</strong> 
</p><p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2912">http://acm.pku.edu.cn/JudgeOnline/problem?id=2912</a></p><img src ="http://www.cppblog.com/zqsand/aggbug/100838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-12 22:03 <a href="http://www.cppblog.com/zqsand/archive/2009/11/12/100838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TC-srm249-Tableseat-DP-状态排列</title><link>http://www.cppblog.com/zqsand/archive/2009/11/12/100835.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Thu, 12 Nov 2009 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/12/100835.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/100835.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/12/100835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/100835.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/100835.html</trackback:ping><description><![CDATA[
<p>Your restaurant has <strong>numTables</strong> tables to seat customers. The tables are all arranged in a line. If a large party of customers comes in, a group of adjacent tables will be used. Which group of tables is entirely up to the customer. Since you cannot predict this, assume all possible choices occur with equal probability. What you can predict is the size of each group of customers that arrives. Element i of <strong>probs</strong> gives the probability, in percent, that an entering party will need i+1 tables. Assuming nobody leaves, return the expected number of tables you will use before a party must be turned away. This only occurs if there is no place to seat them.  </p><h5>Method signature:<br>double getExpected(int numTables, vector &lt;int&gt; probs)</h5> <p><strong>numTables</strong> will be between 1 and 12 inclusive.<br><strong>probs</strong> will contain between 1 and 12 elements inclusive.<br>Each element of <strong>probs</strong> will be between 0 and 100 inclusive.<br>The elements of <strong>probs</strong> will sum to 100.  </p><p>&nbsp; </p><p><font face="微软雅黑" color="#008080" size="4">misof 数字表达教程里的习题~ 题目大意 求使用桌子的期望。由于到来group的个数不定，每个group需要的桌子不定，使确定期望变得困难。但考虑对于numTables来说,使用桌子的状态仅仅有 2^numTables种，因此考虑在这些状态改变的过程中来计算期望，也就是计算在每个状态下面的期望桌子数目。在每个状态到达时，依次考虑来了一个group需要k个位子，如果r种安排可以满足k个位子，那么当前状态的期望值要加上 来k个位子的概率 X （r种安排分别的期望和 / r） 其中求r中安排期望和则需要 递归调用函数。显然利用memo可以减少重复计算于是有下面的解法：</font>  </p><p><font face="Comic Sans MS" size="2">vector&lt;double&gt; p;<br>double dp[1&lt;&lt;13];&nbsp;&nbsp;&nbsp; <br>int tb;<br>double solve(int cur){<br>&nbsp;&nbsp;&nbsp; if(dp[cur]&gt;-1.0)return dp[cur];&nbsp;&nbsp;&nbsp; //memo available<br>&nbsp;&nbsp;&nbsp; double ret=0;double sum;int kind;<br>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;p.size();i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum=0,kind=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mask=(1&lt;&lt;(i+1))-1;&nbsp;&nbsp;&nbsp; //new group need i+1 adjacent tables<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j+i+1&lt;=tb;j++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((cur&amp;(mask&lt;&lt;j))==0){&nbsp;&nbsp;&nbsp; //current pattern could meet the need<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum+=solve(cur+(mask&lt;&lt;j))+i+1;&nbsp;&nbsp;&nbsp; //total method ++<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kind++; <br>&nbsp;&nbsp;&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; if(kind!=0)sum/=kind; //caculate the average need<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret+=sum*p[i];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; dp[cur]=ret;<br>&nbsp;&nbsp;&nbsp; return ret;<br>}</font>  </p><p><font face="Comic Sans MS" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double getExpected(int numTables, vector &lt;int&gt; probs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb=numTables;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REP(i,1&lt;&lt;13)dp[i]=-1.0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.resize(probs.size());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;probs.size();i++)p[i]=probs[i]*0.01;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return solve(0);//the beginning pattern<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font>  </p><p><font color="#ff8040" size="3">看比赛中有另一种解法，即根据题目，在到达每次fail to serve a group 的时候 根据此时的桌子数量，和到达这种状态的概率 来计算：</font></p> <p><font color="#ff8040" size="3">dp[1&lt;&lt;13][15];memset(dp,0,sizeof(dp));// :D lucily I can do this for 0 </font></p> <p><font color="#ff8040" size="3">double fails=0.0;bool flag ;</font></p> <p><font color="#ff8040" size="3">for(int i=1;i&lt;=numTables+1;i++)&nbsp; //循环最多numTables+1 次</font></p> <p><font color="#ff8040" size="3">{flag=true;</font></p> <blockquote> <p><font color="#ff8040" size="3">for(int j=0;j&lt;p.size();j++){</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp; int mask=(1&lt;&lt;(j+1))-1;//注意移位运算符的优先级低,注意加括号</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp; for(int k=0;k&lt;=(1&lt;&lt;numTables-1);k++){</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dp[k][i-1]&lt;=0.0)continue;</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=false;</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cnt=0;</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int m=0;m+j+1&lt;=numTables;m++) if((mask&lt;&lt;m)&amp;k==0)cnt++;</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cnt)for(int m=0;m+j+1&lt;=numTables;m++)if((mask&lt;&lt;m)&amp;k==0)dp[mask&lt;&lt;m|k][i]+=dp[k][i-1]*p[j]/cnt;</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!cnt){</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int b=k,bn=0;while(b){if(b&amp;1)bn++;b&gt;&gt;=1;}</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fail+=dp[k][i-1]*bn;&nbsp; </font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p> <p><font color="#ff8040" size="3">&nbsp;&nbsp;&nbsp; }</font></p> <p><font color="#ff8040" size="3">}</font></p> <p><font color="#ff8040" size="3">if(flag)return fail;//all dp[][k]==0.0</font></p></blockquote> <p><font color="#ff8040" size="3">}</font></p> <p><font color="#ff8040" size="3">return fail;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font color="#ff8040" size="3">优先级很容易错：</font></p> <p><a href="http://www.cppreference.com/wiki/operator_precedence"><font color="#ff8040">http://www.cppreference.com/wiki/operator_precedence</font></a><font color="#ff8040" size="3">~。~</font></p> <p><font color="#ff8040" size="3">典型的几个</font></p> <p><font color="#ff8040" size="3">++ -- &lt;post-incre-decre&gt;</font></p> <p><font color="#ff8040" size="3">~ &lt;bitwise complement&gt; !&lt;not&gt;&amp;&lt;addresss&gt; *&lt;dereference&gt;&amp;&lt;address&gt;</font></p> <p><font color="#ff8040" size="3">*&nbsp; / % </font></p> <p><font color="#ff8040" size="3">+ -</font></p> <p><font color="#ff8040" size="3">&gt;&gt;&nbsp; &lt;&lt;</font></p> <p><font color="#ff8040" size="3">&lt; &lt;= &gt; &gt;=</font></p> <p><font color="#ff8040" size="3">== !=</font></p> <p><font color="#ff8040" size="3">&amp;</font></p> <p><font color="#ff8040" size="3">^ xor</font></p> <p><font color="#ff8040" size="3">|</font></p> <p><font color="#ff8040" size="3">&amp;&amp;</font></p> <p><font color="#ff8040" size="3">||</font></p> <p><font color="#ff8040" size="3">?=</font></p> <p><font color="#ff8040" size="3">= += &#8211;= &lt;&lt;= &gt;&gt;=</font></p> <p><font color="#ff8040" size="3">,</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font color="#ff8040" size="3">从上到下依次降低~~~~~~~~~~~~~~~~~~&#183;&#183;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#ff8040">&nbsp;</font></p> <p><font size="3"></font><font color="#800000">&nbsp;</font></p> <p><font color="#0000ff" size="3"></font></p><img src ="http://www.cppblog.com/zqsand/aggbug/100835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zqsand/" target="_blank">rikisand</a> 2009-11-12 21:45 <a href="http://www.cppblog.com/zqsand/archive/2009/11/12/100835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>