﻿<?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++博客-Puzzle-文章分类-理论AC区</title><link>http://www.cppblog.com/puzzle/category/13347.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 08 Jun 2010 11:59:57 GMT</lastBuildDate><pubDate>Tue, 08 Jun 2010 11:59:57 GMT</pubDate><ttl>60</ttl><item><title>neerc 2009/2010 解题报告</title><link>http://www.cppblog.com/puzzle/articles/116824.html</link><dc:creator>Puzzle</dc:creator><author>Puzzle</author><pubDate>Mon, 31 May 2010 10:41:00 GMT</pubDate><guid>http://www.cppblog.com/puzzle/articles/116824.html</guid><wfw:comment>http://www.cppblog.com/puzzle/comments/116824.html</wfw:comment><comments>http://www.cppblog.com/puzzle/articles/116824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/puzzle/comments/commentRss/116824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/puzzle/services/trackbacks/116824.html</trackback:ping><description><![CDATA[<div style="text-align: right;">
<div style="text-align: center;">neerc 2009/2010 简要解题报告<br></div>
by wangzhihao<br></div>
<ul>
    <li>A</li>
</ul>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>几何,中等<br><span style="font-weight: bold;"><br>题目大意:</span>给你两个三维凸包,如何放置使得他们的质心相距最近?(每个凸包只给你它的顶点,无序),求最近距离<br><br><span style="font-weight: bold;">思路:</span>肯定是把两个凸包的两个面叠在一起,这样就转化成单独求质心到凸包每一面所在的平面的距离,然后再相加即可.<br><br>接下来主要问题是求质心位置. 我们可以随便取一个顶点,以它基点把凸包剖分成若干个四面体,分别求每个四面体的重心,然后加权的加起来即可.<br></div>
<ul>
    <li>B</li>
</ul>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>数学,简单<br>
<span style="font-weight: bold;"><br>
题目大意:</span>有n座电梯,你只能从中选择一辆乘,中途不能换乘,每一座电梯只有两个键,要么上a层楼,要么下b层楼,假设楼无限高,电梯不能低于0楼,你最开始在0楼,你连续按n次,最低会在第几楼?<br><br><span style="font-weight: bold;">思路:</span>理解上直接用实数解 x * a + y * b = 0 &amp;&amp; x + y = n; 然后把x取上整即可.实际做的时候可以用取模避免使用实数</div>
<ul>
    <li>C</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>数学,偏难<br>
<span style="font-weight: bold;"><br>
题目大意:</span>这是一个交互题, 告诉你有一个1-n的排列(n &lt; 200),但你不知道这个排列的样子,你可以询问第i , j, k位的中值是谁, 最多询问2000次,给出那个不知道的排列, 有些排列是通过这种询问不可能区分的, 这种情况下输出任何一个都可以.<br>
<br>
<span style="font-weight: bold;">思路:</span>这道题的解法很巧妙,貌似交互题的解法都很妙.<br><br>首先如果我知道1的位置,那么我可以很快确定其他数的位置.假设现在有三个数的位置为x, y, z. 分别ask(1, x, y) ask(1, y, z) ask(1, x, z)这样必定有且只有两个ask是一样的值, 而且这个值的位置就是公共的那个位置,这样问3次就可以确定一个数.<br><br>上面只是举了个例子, 实际上对于一个排列,知道了最小值,或者最大值,都可以用上面的方法快速的确定其他的值.<br><br>当然直接找1或者n的位置比较困难,可以随便找一对a,b.不妨设 a &lt; b, 对所有的x去ask(x, a, b), 这样对于(a&lt; x &lt; b)直接一次询问就可以确定了 ,对于(x&lt;=a)询问会返回a, 对于(x &gt;= b)会返回 b. 然后分别处理两端即可<br></div>
<ul>
    <li>D</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>Hash,简单<br>
<span style="font-weight: bold;"><br>
题目大意:</span>给你一个n*m的表,(1 &lt;= n &lt;= 10 000, 1 &lt;= m &lt;=10),问是否有两行他们满足下面条件: 他们中有两列相同.<br>
<br>
<span style="font-weight: bold;">思路:</span>枚举列,然后hash判重</div>
<ul>
    <li>E</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>集合DP,偏难<br>
<span style="font-weight: bold;"><br>
题目大意:</span>每种进程需要两种资源, 一共有最多15种资源. 但是为了避免冲突,使用某种资源前要申请,使用时要加锁.这样又有可能会造成死锁, 改变进程对自己的两种资源的申请顺序,使得不会发生死锁,且等待链最长的最短.<br>
<br>
<span style="font-weight: bold;">思路: </span><span style="font-weight: bold;"><br></span></div>
<ul>
    <li>F</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>优先队列,简单<br>
<span style="font-weight: bold;"><br>
题目大意:</span>给你一个字典,字典里有m个单词, m &lt;1000. 你需要再找n个单词,这n个单词要求能够尽量多的能从字典里派生.单词a能从单词b中派生意味着a是b删掉若干字母(也可不删),再按一定排列形成的.<br>
<br>
<span style="font-weight: bold;">思路:</span>用一个优先队列去不断的生成答案,开始是一个空串,每次队首元素必定是当前最优的,然后把它的26个后继加入到队列中,优先级的设置就是该单词能由字典里单词派生的数目.</div>
<ul>
    <li>G</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>找循环 , 中等<br>
<span style="font-weight: bold;"><br>
题目大意:</span> 题目描述比较长, 定义了若干规则,然后模拟n步(n &lt;= 10^100),然后计数.<br>
<br>
<span style="font-weight: bold;">思路: </span>想法比较直接,直接找循环<span style="font-weight: bold;"><br></span></div>
<ul>
    <li>H</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类:&nbsp; </span>概率, 简单<br>
<span style="font-weight: bold;"><br>
题目大意: </span>两人在用左轮手枪赌命, 现在对手开一枪没事,轮到自己有两种选择,一是重新转一下再开枪,二是直接开枪,告诉你子弹初始的放置情况,问那种生存概率更大.<br>
<br>
<span style="font-weight: bold;">思路:</span>直接统计一下两种概率,再比较一下即可</div>
<ul>
    <li>I</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>网络流,中等<br>
<span style="font-weight: bold;"><br>
题目大意:</span>给你一个有向无环图, 找若干路径把所有点覆盖, 路径直接可以相交<br>
<br>
<span style="font-weight: bold;">思路:</span></div>
<ul>
    <li>J</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span>动规,中等<br>
<span style="font-weight: bold;"><br>
题目大意:</span>&nbsp; 题目大概意思是有个人参加考试。这张试卷上有m种题型，共n道题（全是选择题~），最后的成绩上告诉他一共错了k道题，对于每类题型，正确率分别为
Pi% 。现在他想知道每类题里面他分别错了多少道。但是可能会有很多合法的情况。求在所有题型中，最多题目数 - 最少题目数
的差值最小的那种情况。保证至少存在一种合法情况。所有数为整数。（正确率使用一个比较纠结的取整函数，具体见题目）<br>
<br>
<span style="font-weight: bold;">思路:</span> dp[i][j][k] 表示考虑到第i个题型，一共做了j个题，错了k个题是否可能。转移再枚举第i个题型一共做x个题，错y个题，看是否可行, 由于真正能转移的很少,所以可搞<br></div>
<ul>
    <li>K</li>
</ul>
<br>
<div style="margin-left: 40px;"><span style="font-weight: bold;">分类: </span><br>
<span style="font-weight: bold;"><br>
题目大意:</span><br>
<br>
<span style="font-weight: bold;">思路:</span></div><img src ="http://www.cppblog.com/puzzle/aggbug/116824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/puzzle/" target="_blank">Puzzle</a> 2010-05-31 18:41 <a href="http://www.cppblog.com/puzzle/articles/116824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[汇总]字符串题目推荐及解题报告</title><link>http://www.cppblog.com/puzzle/articles/113830.html</link><dc:creator>Puzzle</dc:creator><author>Puzzle</author><pubDate>Wed, 28 Apr 2010 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/puzzle/articles/113830.html</guid><wfw:comment>http://www.cppblog.com/puzzle/comments/113830.html</wfw:comment><comments>http://www.cppblog.com/puzzle/articles/113830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/puzzle/comments/commentRss/113830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/puzzle/services/trackbacks/113830.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/puzzle/articles/113830.html'>阅读全文</a><img src ="http://www.cppblog.com/puzzle/aggbug/113830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/puzzle/" target="_blank">Puzzle</a> 2010-04-28 11:19 <a href="http://www.cppblog.com/puzzle/articles/113830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>regional Tokyo (Japan) 2009/2010 by Puzzle</title><link>http://www.cppblog.com/puzzle/articles/110483.html</link><dc:creator>Puzzle</dc:creator><author>Puzzle</author><pubDate>Wed, 24 Mar 2010 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/puzzle/articles/110483.html</guid><wfw:comment>http://www.cppblog.com/puzzle/comments/110483.html</wfw:comment><comments>http://www.cppblog.com/puzzle/articles/110483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/puzzle/comments/commentRss/110483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/puzzle/services/trackbacks/110483.html</trackback:ping><description><![CDATA[A.两种view，对应如果有相同的同时消去并加入一次计数，如果2个view不相同的则都加入计数。(topsky ac)<br><br>B.BFS,如果TLE则双向广搜，难点可能在于判重，试试tire树。(topsky)<br><br>C.模拟题，用一个struct{int dt,int t},开两个队列，每次比较两个队列头元素的时间，取时间小的，并将对应队列中余下的元素中时间小于头元素时间的元素取出，并将这些元素的时间修改为头元素的时间，把取出来的元素按照游完一圈所需时间排序后，进入另一个队列，为了方便还可以用一个堆，直到模拟到结束。(topsky ac)<br><br>D.经典题，有红蓝点集，问是否存在一条直线将其划分,做法先求凸包，然后判相交。(haozi)<br><br>E.模拟,维护面集和铰链集.(ac by haozi)<br><br>F.给你一个化学方程式，将他配平。最后的系数保证在int范围内，且为正整数。涉及到表达式运算，和高斯消元。由于结果要是整数。我们可以在消元的每一步都保持系数是整数，这样最后结果就是整数。具体说就是两行相消的时候乘回一个系数，再约掉最大公约数。(haozi ac by lwc)<br><br>G.想二分一个圆的半径，然后确定另外两个圆的位置，判断这两个圆是相交,还是想离。<br>&nbsp;&nbsp;&nbsp;ps. lwc topsky帮我在网上搜几个更好的解法，我搜不到了(haozi)<br><br>H.集合DP，考虑某个状态a1, a2, .. ak考虑过了，并且标明其属性(yes / no)，其他未考虑，这个状态最坏还需要问几次。转移就是在做一次提问，转移到下一个状态，边界就是当某一个状态的人数不超过1时，标明还需问0次。(haozi&nbsp; ac by lwc)<br><br>I.搜索加模拟，暂没想法.(topsky)<br><br>J. bfs,用一个数字2^25*25来记录当前状态，25位压缩表示某一位上是否有'#'，25表示当前<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#64;&#39;">'@'</a>在哪一位上。可以先处理出和某位相邻的位置为哪些来加速，map来判重，hash效果基本相同，现在2.7s.(topsky ac)<br><img src ="http://www.cppblog.com/puzzle/aggbug/110483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/puzzle/" target="_blank">Puzzle</a> 2010-03-24 22:23 <a href="http://www.cppblog.com/puzzle/articles/110483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>