第三章 noip2010题解.pdfVIP

  • 3
  • 0
  • 约3.73千字
  • 约 5页
  • 2017-06-25 发布于湖北
  • 举报
NOIP2010 解题报告 天津市南开中学 钱桥 首先对这次比赛做一个总体分析。第一题我觉得没什么好说的,作为一道简单题还是挺简单 的。第二题是动态规划,朴素的做法可以得到 30-50 分,如果发现了方程中的一个小优化 并且稳稳当当地作对,可以拿到满分。第三题暴力搜索可以拿到 30 分。如果想得到满分, 首先要想到二分答案,可能多数同学没有想到这个方向上,再验证是否是二分图,通过 BFS 实现,就可以拿到满分了。第三题还有一个并查集的方法也可以做。第四题确实较难,首先 通过 BFS 判断“无解”的情况,可以拿到 30 分,而对于有解的情况,需要仔细分析,得出 一个“重要结论”,之后用到 BFS 和 Dp 可以拿到满分。 下面我将逐题进行分析 第一题: (由于是 NOIP,这道题的题解我就给个时间复杂度高一点但是好理解的吧,大牛们忽略此 题题解) 我们用一个 a 数组维护当前内存存储的单词,并且从 1 到 m 的位置就是单词进入内存的先 后顺序。一开始内存是空的,所以所有位置上都是-1。 我们顺序操作文章中的 n 个单词,对于每个单词,我们都查找它当前是否在内存中。若它 在内存中,直接忽略过去;若它不在内存中,就需要把内存的 2~m 位置上的单词往前挪(挪 到 1~m-1 处),并把新的这个单词放到 m 处,并把答案类加 1。最后输出答案即可。 第二题: 我们的任务是用给定的卡片从 1 走到 n,最终得分最大。动态规划的味道似乎挺浓的,于是 尝试一下。 动态规划首先要用变量来表示出状态。若要表示当前状态,需要用的变量是:当前位置、当 前还剩余哪些卡片。当前位置很好记录,一个变量 i 即可。而“当前还剩余哪些卡片”似乎 并不好记录。但仔细观察数据规模就会发现,卡片上的数值只会是 1、2、3、4,并且每种 不会超过 40 张,这样我们可以用 4 个变量 j1、j2、j3、j4 也可以记录了。而我们仔细观察 就会发现,这 5 个变量存在一个恒等式:i+j1+j2*2+j3*3+j4*4=n,也就是说其中一个可 以通过另外四个推出来。于是我们只需要 4 个变量(j1, j2, j3, j4)就可以表示出当前的状 态了。我们另 F[j1, j2, j3, j4]表示剩余 j1 张 1 卡片、剩余 j2 张 2 卡片、剩余 j3 张 3 卡片, 剩余 j4 张 4 卡片,走到 n 的最大得分。 而转移成子问题似乎也很显然: F[j1, j2, j3, j4] = a[n - j1+j2*2+j3*3+j4*4] + max(F[j1-1, j2, j3, j4] F[j1, j2-1, j3, j4] F[j1, j2, j3-1, j4] F[j1, j2, j3, j4-1]) 边界 F[0, 0, 0, 0]=a[n]。所求为 F[m1, m2, m3, m4]。 时间复杂度:O(p^4) 其中 p 为题目给定的每种卡片不超过 40 第三题: 这道题是一个明显的“最大值最小”问题。解释一下,就是让你找出一个分配方案,使得所 有冲突中的最大值尽量的小。“最大值最小”问题 99%都可以用二分答案来做。再具体解释 一下: 如果最后最小的最大冲突为 ans。对于一个在区间[0, ans)的数 k,一定不满足命题“所有 冲突值都小于等于 k”,而对于一个在区间[ans, 1000000000]的数 k,一定满足命题“所有 冲突值都小于等于 k”。这就好比是一个猜价格的游戏,你猜一个价格,我告诉你高了还是 低了,如果高了你就往低猜,如果低了你就往高猜。而这道题是你猜一个 k,根据它满足命 题还是不满足命题决定再大点还是再小点。当然,最快的方法就是在区间[0, 1000000000] 上二分这个 k。 那接下来我们的任务就变成了,验证一个 k,是否能满足命题“所有冲突都小于等于 k”。 而这个命题等价于“所有冲突值大于 k 的两个犯人必须被关押在不同的监狱”。那么通过 BFS 染色就可以判断。 时间复杂度:O(M*log(10^9)) 对于另一做法,需要一个更高级的知识——并查集。这里简单说说。 首先把所有冲突按照从大到小进行排序,然后进行操作。我们都检验,对于当前冲突的两个 人是否能把他俩分开。直到遇到两个人,他俩不可能被分

文档评论(0)

1亿VIP精品文档

相关文档