﻿<?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++博客-乱八七糟的代码-随笔分类-USACO</title><link>http://www.cppblog.com/zqsand/category/12852.html</link><description>啥是子标题</description><language>zh-cn</language><lastBuildDate>Wed, 20 Jan 2010 11:25:04 GMT</lastBuildDate><pubDate>Wed, 20 Jan 2010 11:25:04 GMT</pubDate><ttl>60</ttl><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>[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></channel></rss>