﻿<?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++博客-乱八七糟的代码-随笔分类-Algorithm</title><link>http://www.cppblog.com/zqsand/category/12850.html</link><description>啥是子标题</description><language>zh-cn</language><lastBuildDate>Wed, 20 Jan 2010 11:25:00 GMT</lastBuildDate><pubDate>Wed, 20 Jan 2010 11:25:00 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>USACO 0912 月赛</title><link>http://www.cppblog.com/zqsand/archive/2009/12/13/103138.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Sun, 13 Dec 2009 13:14:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/12/13/103138.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/103138.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/12/13/103138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/103138.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/103138.html</trackback:ping><description><![CDATA[
<p>silver组：</p> <p>比赛那天感冒，第一题就弄晕了，现在题解出来了，补上吧~~</p> <p>暂时只有第一题的：</p><pre>Problem 6: Bobsledding [Brian Jacokes, 2009]

Bessie has entered a bobsled competition because she hopes her hefty
weight will give her an advantage over the L meter course (2 &lt;= L
&lt;= 1,000,000,000).

Bessie will push off the starting line at 1 meter per second, but
her speed can change while she rides along the course. Near the
middle of every meter Bessie travels, she can change her speed
either by using gravity to accelerate by one meter per second or
by braking to stay at the same speed or decrease her speed by one
meter per second.

Naturally, Bessie must negotiate N (1 &lt;= N &lt;= 100,000) turns on the
way down the hill. Turn i is located T_i meters from the course
start (1 &lt;= T_i &lt;= L-1), and she must be enter the corner meter at
a speed of at most S_i meters per second (1 &lt;= S_i &lt;= 1,000,000,000).
Bessie can cross the finish line at any speed she likes.

Help Bessie learn the fastest speed she can attain without exceeding
the speed limits on the turns.

Consider this course with the meter markers as integers and the
turn speed limits in brackets (e.g., '[3]'):

|   1   2   3   4   5   6   7[3]
|---+---+---+---+---+---+---+
|                            \
Start                         + 8    
                               \
                                + 9    
                                 \
                                  + 10       +++ 14 (finish)
                                   \         /
                              11[1] +---+---+
                                        12  13[8]

Below is a chart of Bessie's speeds at the beginning of each meter length
of the course:

Max:                              3               1       8
Mtrs: 0   1   2   3   4   5   6   7   8   9  10  11  12  13  14 
Spd:  1   2   3   4   5   5   4   3   4   3   2   1   2   3   4

Her maximum speed was 5 near the beginning of meter 4.

PROBLEM NAME: bobsled

INPUT FORMAT:

* Line 1: Two space-separated integers: L and N

* Lines 2..N+1: Line i+1 describes turn i with two space-separated
        integers: T_i and S_i

SAMPLE INPUT (file bobsled.in):

14 3
7 3
11 1
13 8

OUTPUT FORMAT:

* Line 1: A single integer, representing the maximum speed which
        Bessie can attain between the start and the finish line,
        inclusive.

SAMPLE OUTPUT (file bobsled.out):

5</pre>
<p><font face="Comic Sans MS" color="#c96310" size="4"></font>&nbsp;</p>
<p><font face="Comic Sans MS" color="#c96310" size="4">题目看起来挺复杂，其实主要是求出各个turn处的最大速度，分析得到每个turn的最大速度需要满足三个条件， M_i = min (S_i , t_i &#8211; t_{i-1} + M_{i-1} , S_k + t_k &#8211; t_i [for all k &gt; i ] )</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4">因此处理每一个turn都要查询N个turn N*N的复杂度显然对于大数据要TLE的</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4">逆向思考，如果我们反过来考虑，对于每一个之后的turn来说 如：i&nbsp; 如果他最大速度为 m_i</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4">那么 在turn i-1处，他不能超过的最大速度 m_{i-1} = min(S_i,m_i+t_i &#8211; t_{i-1});这样成功的把后面两个限制转换为逆推的结果而不是向后查询</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4">剩下的问题便是如果知道两个turn之间距离，以及turn的速度最大值，如何求出之间的最大值，画图显然可以得到一种算式 maxspeed = min(s1,s2) + (dist2-dist1+abs(s1-s2))/2;</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4"> 或者 maxspeed = max(s1,s2) + (dist2 &#8211; dist1 &#8211; abs(s1-s2))/2;</font></p>
<p><font face="Comic Sans MS" color="#c96310" size="4">注意在开头和结尾加入虚拟的turn就可以了</font></p>
<p>&nbsp;</p>
<div class="wlWriterEditableSmartContent" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4029ec0f-8e86-4d20-a755-8fde6d8b1691" 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"> </span><span style="background:#373737;color:#c1c0c1">REP</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">n</span><span style="background:#373737;color:#c0c0c0">)&nbsp;&nbsp;</span><span style="background:#373737;color:#d24400">for</span><span style="background:#373737;color:#c0c0c0">(&nbsp;&nbsp;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> (</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">) = </span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0"> ; </span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0"> &lt; (</span><span style="background:#373737;color:#c1c0c1">n</span><span style="background:#373737;color:#c0c0c0">) ; ++</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">)</span><br>
<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"> </span><span style="background:#373737;color:#c1c0c1">std</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">L</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#d24400">struct</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">node{</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"> </span><span style="background:#373737;color:#c1c0c1">dist</span><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">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">speed</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#c0c0c0">};</span><br>
<span style="background:#373737;color:#c1c0c1">vector</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#c1c0c1">node</span><span style="background:#373737;color:#c0c0c0">&gt; </span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#d24400">bool</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">comp</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">const</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">node</span><span style="background:#373737;color:#c0c0c0">&amp; </span><span style="background:#373737;color:#c1c0c1">n1</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#d24400">const</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">node</span><span style="background:#373737;color:#c0c0c0">&amp; </span><span style="background:#373737;color:#c1c0c1">n2</span><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:#c1c0c1">n1</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#c1c0c1">n2</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#c0c0c0">}</span><br>
<span style="background:#373737;color:#c1c0c1">vector</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0">&gt; </span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#d24400">#define</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">inf</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#9ab40a">98765433</span><br>
<span style="background:#373737;color:#d24400">void</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">solve</span><span style="background:#373737;color:#c0c0c0">()</span><br>
<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#00e300">//freopen("e:\\usaco\\bobsled.11.in","r",stdin);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#00e300"></span><span style="background:#373737;color:#c1c0c1">freopen</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#ffc4e1">"bobsled.in"</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#ffc4e1">"r"</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">stdin</span><span style="background:#373737;color:#c0c0c0">);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">freopen</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#ffc4e1">"bobsled.out"</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#ffc4e1">"w"</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">stdout</span><span style="background:#373737;color:#c0c0c0">);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">cin</span><span style="background:#373737;color:#c0c0c0">&gt;&gt;</span><span style="background:#373737;color:#c1c0c1">L</span><span style="background:#373737;color:#c0c0c0">&gt;&gt;</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">resize</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">2</span><span style="background:#373737;color:#c0c0c0">); </span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">resize</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">2</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">); </span><span style="background:#373737;color:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">resize</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">2</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">); </span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0"> =</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">speed</span><span style="background:#373737;color:#c0c0c0"> =</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0"> =</span><span style="background:#373737;color:#c1c0c1">L</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">speed</span><span style="background:#373737;color:#c0c0c0">=</span><span style="background:#373737;color:#c1c0c1">inf</span><span style="background:#373737;color:#c0c0c0">;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">REP</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">) </span><span style="background:#373737;color:#c1c0c1">scanf</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#ffc4e1">"%d %d"</span><span style="background:#373737;color:#c0c0c0">,&amp;</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">,&amp;</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">speed</span><span style="background:#373737;color:#c0c0c0">);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">sort</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">begin</span><span style="background:#373737;color:#c0c0c0">(),</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">.</span><span style="background:#373737;color:#c1c0c1">end</span><span style="background:#373737;color:#c0c0c0">(),</span><span style="background:#373737;color:#c1c0c1">comp</span><span style="background:#373737;color:#c0c0c0">);</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">] = </span><span style="background:#373737;color:#c1c0c1">inf</span><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">for</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">=</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">&gt;</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">i</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:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">] = </span><span style="background:#373737;color:#c1c0c1">min</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">speed</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">1</span><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">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">maxspeed</span><span style="background:#373737;color:#c0c0c0"> = </span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">]=</span><span style="background:#373737;color:#9ab40a">1</span><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">for</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">=</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">&lt;</span><span style="background:#373737;color:#c1c0c1">N</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#9ab40a">2</span><span style="background:#373737;color:#c0c0c0">;</span><span style="background:#373737;color:#c1c0c1">i</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:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">] = </span><span style="background:#373737;color:#c1c0c1">min</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">down</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">],</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">]+</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0"> - </span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</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:#c1c0c1">maxspeed</span><span style="background:#373737;color:#c0c0c0"> = </span><span style="background:#373737;color:#c1c0c1">max</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">maxspeed</span><span style="background:#373737;color:#c0c0c0">,</span><span style="background:#373737;color:#c1c0c1">min</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">],</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">])+(</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#c1c0c1">vec</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">].</span><span style="background:#373737;color:#c1c0c1">dist</span><span style="background:#373737;color:#c0c0c0">+</span><span style="background:#373737;color:#c1c0c1">abs</span><span style="background:#373737;color:#c0c0c0">(</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">]-</span><span style="background:#373737;color:#c1c0c1">up</span><span style="background:#373737;color:#c0c0c0">[</span><span style="background:#373737;color:#c1c0c1">i</span><span style="background:#373737;color:#c0c0c0">-</span><span style="background:#373737;color:#9ab40a">1</span><span style="background:#373737;color:#c0c0c0">]))/</span><span style="background:#373737;color:#9ab40a">2</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:#c1c0c1">cout</span><span style="background:#373737;color:#c0c0c0">&lt;&lt;</span><span style="background:#373737;color:#c1c0c1">maxspeed</span><span style="background:#373737;color:#c0c0c0">&lt;&lt;</span><span style="background:#373737;color:#c1c0c1">endl</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#c0c0c0">}</span><br>
<span style="background:#373737;color:#c0c0c0"> </span><br>
<span style="background:#373737;color:#c0c0c0"> </span><br>
<span style="background:#373737;color:#d24400">int</span><span style="background:#373737;color:#c0c0c0"> </span><span style="background:#373737;color:#c1c0c1">main</span><span style="background:#373737;color:#c0c0c0">()</span><br>
<span style="background:#373737;color:#c0c0c0">{</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="background:#373737;color:#c0c0c0"></span><span style="background:#373737;color:#c1c0c1">solve</span><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:#9ab40a">0</span><span style="background:#373737;color:#c0c0c0">;</span><br>
<span style="background:#373737;color:#c0c0c0">}</span></div>
</div>
</div>
<p><font face="Comic Sans MS" color="#c96310" size="4"></font>&nbsp;</p>
<p><font face="Comic Sans MS" color="#c96310" size="4"></font>&nbsp;</p>
<p><font face="Comic Sans MS" color="#c96310" size="4"></font></p><img src ="http://www.cppblog.com/zqsand/aggbug/103138.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 21:14 <a href="http://www.cppblog.com/zqsand/archive/2009/12/13/103138.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><item><title>[USACO 09NOV] silver xoinc [dp]</title><link>http://www.cppblog.com/zqsand/archive/2009/11/12/100754.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Wed, 11 Nov 2009 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/12/100754.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/100754.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/12/100754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/100754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/100754.html</trackback:ping><description><![CDATA[

<p><font face="微软雅黑" color="#008040" size="4">周六第一次做usaco玩，bronze的轻松切掉，然后申请promote，下午批准，话说rob 效率好高啊~ 于是继续做silver 就遇到这个题- -！纠结了半天放弃&#183;&#183;&#183;&#183;知道是dp 也考虑了方法就是 理不清楚；不知道是不是一天没吃饭的缘故&#183;&#183;&#183;&#183;&#183;</font></p> <p><font face="微软雅黑" color="#008040" size="4">今天题解出来了~ 先看了大概思路 然后自己写出来了~</font></p> <p><font face="微软雅黑" color="#008040" size="4">题目：</font></p> <blockquote><pre><font face="Comic Sans MS" size="4">Farmer John's cows like to play coin games so FJ has invented with
a new two-player coin game called Xoinc for them.

Initially a stack of N (5 &lt;= N &lt;= 2,000) coins sits on the ground;
coin i from the top has integer value C_i (1 &lt;= C_i &lt;= 100,000).

The first player starts the game by taking the top one or two coins
(C_1 and maybe C_2) from the stack. If the first player takes just
the top coin, the second player may take the following one or two
coins in the next turn. If the first player takes two coins then
the second player may take the top one, two, three or four coins
from the stack. In each turn, the current player must take at least
one coin and at most two times the amount of coins last taken by
the opposing player. The game is over when there are no more coins
to take.

Afterwards, they can use the value of the coins they have taken
from the stack to buy treats from FJ, so naturally, their purpose
in the game is to maximize the total value of the coins they take.
Assuming the second player plays optimally to maximize his own
winnings, what is the highest total value that the first player can
have when the game is over?

MEMORY LIMIT: 20 MB

PROBLEM NAME: xoinc

INPUT FORMAT:

* Line 1: A single integer: N

* Lines 2..N+1: Line i+1 contains a single integer: C_i

SAMPLE INPUT (file xoinc.in):

5
1
3
1
7
2</font></pre><pre><font size="4"><font face="微软雅黑" color="#008040">简单来说就是两个人轮流取coins，每个人每次取得个数为1- 2*n;n为上一轮对方取得数目，</font></font></pre><pre><font face="微软雅黑" color="#008040" size="4">求两个人都是用最佳策略，先取得那个家伙最多能拿到多少硬币。貌似可以算是简单博弈论的思想</font></pre><pre><font face="微软雅黑" color="#008040" size="4">思路：</font></pre><pre><font face="微软雅黑" color="#008040" size="4">        coins[1&#183;&#183;&#183;N] 从下到上 sum[1&#183;&#183;&#183;N] 剩下 i个的和</font></pre><pre><font face="微软雅黑" color="#008040" size="4">        找到无后效性的子问题。考虑在还剩下p个钱币时候的情况，此时可以拿k个钱</font></pre><pre><font face="微软雅黑" color="#008040" size="4">由于条件，k的大小受上一轮拿的个数i的限制 ，所以我们要加上一个变量i。得到</font></pre><pre><font face="微软雅黑" color="#008040" size="4">dp[p][i]这个子问题。那么容易得到</font></pre><pre><font face="微软雅黑" color="#008040" size="4">dp[p][i]=max(1=&lt;k&lt;=i*2){SuM(p to p-k+1)+SuM(p-k to 1)-dp[p-k][k]}</font></pre><pre><font face="微软雅黑" color="#008040" size="4">            =max(1=&lt;k&lt;=i*2){sum[p]-dp[p-k][k]}</font></pre><pre><font face="微软雅黑" color="#008040" size="4">按照这个可以得到一个O（N^3）的算法</font></pre>
<p><span style="background: #2b2b2b; color: #0080ff">oid</span><span style="background: #2b2b2b; color: white">solve(){<br>&nbsp;&nbsp; </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++)</span><span style="background: #2b2b2b; color: #00ff40">//剩下i个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </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">1</span><span style="background: #2b2b2b; color: white">;j&lt;=N;j++)</span><span style="background: #2b2b2b; color: #00ff40">//上一人拿了j 个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </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">k=</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">;k&lt;=j*</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">&amp;&amp;i-k&gt;=</span><span style="background: #2b2b2b; color: #ff8080">0</span><span style="background: #2b2b2b; color: white">;k++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dp[i][j]=max(dp[i][j],sum[</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]-sum[i+</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]-dp[i-k][k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ret=dp[N][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">];<br>} </span></p>
<p><font color="#804000">&nbsp;</font><font face="微软雅黑" color="#804000" size="4">三重递归 ，最多可以过500的数据量&nbsp; 观察可以得出 dp[p][j] 和 dp[p][j+1] 的计算有很多的重叠<br>因为 上次拿了j+1 则可以比 dp[p][j] 多拿 2 个&nbsp; </font></p>
<p><font face="微软雅黑" color="#804000" size="4">然后，由于考虑j的范围 应该为 N-i+1</font></p>
<p><font face="微软雅黑" color="#804000" size="4">这样得到了最终代码：</font></p><pre class="code"><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">    scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d"</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: white">,&amp;N); 
    </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++)    scanf(</span><span style="background: #2b2b2b; color: #ff8000">"%d"</span><span style="background: #2b2b2b; color: white">,coins+i);</span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">//{fin&gt;&gt;coins[i]; }
    </span><span style="background: #2b2b2b; color: white">sum[</span><span style="background: #2b2b2b; color: #ff8080">0</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">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++)     sum[i]=sum[i-</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]+coins[N-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">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++)        </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">//剩?下?i 个?
    </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">1</span><span style="background: #2b2b2b; color: white">;j&lt;= N-i +</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">;j++){ </span></font></font><font size="2"><font face="Comic Sans MS"><span style="background: #2b2b2b; color: #00ff40">// 上?次?拿?了?j 个?
    </span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(dp[i][j]&lt;dp[i][j-</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">])dp[i][j]=dp[i][j-</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">(</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j-</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">&lt;=i&amp;&amp;dp[i][j]&lt;sum[i]-dp[i-</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j+</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j-</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]) dp[i][j]=sum[i]-dp[i-</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j+</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j-</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">(</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j&lt;=i&amp;&amp;dp[i][j]&lt;sum[i]-dp[i-</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j][</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j]) dp[i][j]= sum[i]-dp[i-</span><span style="background: #2b2b2b; color: #ff8080">2</span><span style="background: #2b2b2b; color: white">*j][</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">*j];
    } 
    printf(</span><span style="background: #2b2b2b; color: #ff8000">"%d\n"</span><span style="background: #2b2b2b; color: white">,dp[N][</span><span style="background: #2b2b2b; color: #ff8080">1</span><span style="background: #2b2b2b; color: white">]);</span></font></font></pre><a href="http://11011.net/software/vspaste"></a></blockquote>
<p><font face="华文琥珀" color="#00ff40" size="5"><strong>很晚了 ，先写这么多 ，有空把bronze的写了</strong></font></p><img src ="http://www.cppblog.com/zqsand/aggbug/100754.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 00:20 <a href="http://www.cppblog.com/zqsand/archive/2009/11/12/100754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ALGORITHM IN C (1)</title><link>http://www.cppblog.com/zqsand/archive/2009/11/11/100725.html</link><dc:creator>rikisand</dc:creator><author>rikisand</author><pubDate>Wed, 11 Nov 2009 12:18:00 GMT</pubDate><guid>http://www.cppblog.com/zqsand/archive/2009/11/11/100725.html</guid><wfw:comment>http://www.cppblog.com/zqsand/comments/100725.html</wfw:comment><comments>http://www.cppblog.com/zqsand/archive/2009/11/11/100725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zqsand/comments/commentRss/100725.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zqsand/services/trackbacks/100725.html</trackback:ping><description><![CDATA[
<pre class="code"><font size="4">Steps to developing a usable algorithm.<br>&#8226; Define the problem.<br>&#8226; Find an algorithm to solve it.<br>&#8226; Fast enough?<br>&#8226; If not, figure out why.<br>&#8226; Find a way to address the problem.<br>&#8226; Iterate until satisfied.</font></pre>
<p><font size="4">&nbsp; </font>
</p><p><font size="4">主要内容 FIND-UNION ALGORITHM </font>
</p><p><font size="4">就是利用并查集来考察连通性的算法 。条件N个节点，M对节点，输入每一对节点时候，如果已经连通，则忽略，否则输出接点并更新 </font>
</p><p><font size="4">主要介绍三种算法：第一种，QUCK-FIND 利用数组记录每一个联通子图，同一个联通子图的节点数组变量是相同的。因此每读入一对就需要遍历N个数组变量考察是否需要更新，最坏时间MN，实际上每个子图为高度为2的树;第二种，QUICK-UNION 联通子图需要union时 仅仅需要将两个root union 因此每个联通子图高度变高，所有find root 会消耗一定时间，当然无需遍历N了 ，最坏时间，也就是每次均需要从叶子节点去回溯求根（这里书中举得例子好像有问题）也是MN；第三种也就是 QUICK WEIGHT UNION 这种方法在两个子树合并的时候，不是简单的指定合并策略，而是经过判断的，把size小（相应高度也小）的合并到size大的里面；实际上很容易理解就是尽量减少树的高度来追求quick-find的效率； </font>
</p><p><font size="4">进而作者写道路径压缩，也是这种思想。或者实现为全部压缩，也就是说在进行union操作的时候，所有check的节点都直接链接到union后的新root下面，或者half union （容易实现且性能好）每次check时候，如果没有停止loop简单的令 id[i]=id[id[i]];即可达到减少到根距离的效果。 </font>
</p><p><font size="4">half union 的主要代码：</font></p><pre class="code"><span style="background: #2b2b2b; color: #0080ff"><font size="4">int </font></span><font size="4"><span style="background: #2b2b2b; color: white">i,j;
</span><span style="background: #2b2b2b; color: #0080ff">for</span></font><font size="4"><span style="background: #2b2b2b; color: white">(i=p;id[i]!=i;i=id[i]) id[i]=id[id[i]];
</span><span style="background: #2b2b2b; color: #0080ff">for</span></font><font size="4"><span style="background: #2b2b2b; color: white">(j=p;id[j]!=j;j=id[j]) id[j]=id[id[j]];
</span><span style="background: #2b2b2b; color: #0080ff">if</span><span style="background: #2b2b2b; color: white">(i==j)</span><span style="background: #2b2b2b; color: #0080ff">continue</span></font><font size="4"><span style="background: #2b2b2b; color: white">;
</span><span style="background: #2b2b2b; color: #0080ff">if</span></font><font size="4"><span style="background: #2b2b2b; color: white">(size[i]&gt;size[j]) id[j]=i,size[i]+=size[j];
</span><span style="background: #2b2b2b; color: #0080ff">else        </span><span style="background: #2b2b2b; color: white">id[i]=j,size[j]+=size[i];</span></font></pre><a href="http://11011.net/software/vspaste"></a>
<p><font size="5"></font>&nbsp; </p><p><font size="5">第一次用windows live writer 试试效果哦~~</font> 
</p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font>&nbsp; </p><p><font size="5"></font></p><img src ="http://www.cppblog.com/zqsand/aggbug/100725.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-11 20:18 <a href="http://www.cppblog.com/zqsand/archive/2009/11/11/100725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>