05年的题目绝对是自2000年以来难度最大的。后三题的难度系数分别为0.2、0.2、0.3,而前面几年的题目中每年最多只出现一道难度系数为0.2的题目,其难度可见一斑。

强烈推荐这个 PPT,每道题都讲得很清楚:http://wenku.baidu.com/view/878beb64783e0912a2162aa7.html

第一题:谁拿了最多奖学金

模拟

第二题:过河

动态规划+优化

首先看到题目的数据范围就已经让人心生畏惧了。1e9这么大的数字,无论从空间还是时间都无法承受。

动态规划是很容易就能想到的。

用 f(i) 表示跳到i点时最少踩到的石子数,则

f(i) = min(f(i-s), f(i-s+1), … , f(i-t)) + stone(i)

(stone(i) 用于表示i点处是否有石子,若有则为1,否则为0)

虽然题目给出的数据范围表示30% 的数据在1e5以内,但是用这种方法只能得到10分。(也许是因为我在一些细节的地方写错了)

然后如何进行优化?

我们注意到L可能达到1e9,而石子数最多不超过10,所以可以肯定,(算上起点和终点)至少有两个点之间的距离比较大,而S和T比较小,则对于较大的一段距离而言,无论怎样都能跳过中间部分而不踩到石子,也就是说这一段距离内的大部分点即使不进行计算也不会对最终结果产生影响,而能对结果产生影响的区间分布在石子附近。所以我们可以把两个石子之间的距离缩短,去除中间那些无关紧要的部分。

关于如何缩短距离有很多方法,比如当两点距离大于100时将它缩短等等。但是缩短到多少呢?

事实上对于每个石头所在的点i,会影响其结果的点是:i-T, i-T+1, ..., i-S-1, i-S. 所以至少要给它留出T的空段,当然最好是前后各有T,所以可缩短到2T或以上。

第三题:篝火晚会

找规律

首先,判断是否有解是比较容易的:如果有一个人 A 想和 B 相邻,但 B 不想和 A 相邻,那么必然无解。

由于没有思路,我判断了无解之后就直接交了,10 分。

为了方便处理,要把一个长度为 n 的环拆成 2n 条链。因为从每个点出发都可以由两个方向得到两条链。

然后,在有解的情况下,我们可以构造出最终状态。我们要做的就是从初始状态变换到最终状态。初始状态和最终状态各有 2n 种,我们要求出从一种初始状态到一种最终状态最少的变换步数。两个状态之间的变换步数很明显等于错位的元素个数。如果直接枚举计算,复杂度是 O(2n*2n*n)。可以拿 30 分。

我们可以换一种思考方式,把「找最少的错位元素个数」变为「找最多的不动元素个数」。也就是说从一个状态到另一个状态,变换步数=总元素个数-位置正确的元素个数。同时我们注意到,初始和最终状态的各种形式中,元素的相对位置是不会改变的。那么我们对于每个元素,对其现在位置与应该在的位置作差(如果是负数就加上 n),记为 v[i]。那么对于 v 值相同的元素,我们总能找到另一种状态,它们的 v 值都为 0。 那么我们只要在任意一种状态里找 v 值相同的元素即可。我们找到最多有多少元素的 v 值相等,记这个最多的个数为 max,那么这些数在某个状态下肯定是不用移动的,所以变换步数就为 n – max。注意要同时考虑逆序的情况,也就是说在初始状态中取一种,在最终状态中取一种以及其倒序,对这两种统计 v 值。

第四题:等价表达式

表达式求值

关于基本的中缀表达式求值问题详见此文: http://www.cnblogs.com/dolphin0520/p/3708602.html 。这篇文章说得很好。总结起来如下:

建立两个栈:操作数栈和运算符栈。每次遇到数字就入栈,遇到操作符的情况下,如果该操作符的优先级高于栈顶操作符的优先级就入栈,否则就不断将操作数和栈顶操作符出栈计算值然后将值入栈,直到栈顶操作符的优先级低于当前操作符。注意对括号的特殊处理。我的处理方式是对于左括号让其入栈,如果遇到右括号就不断弹栈计算,直到遇到左括号,然后将左括号出栈,右括号也就不用入栈了。

然后,判断两个表达式是否等价有两种方法:

  1. 代入具体的值并计算,重复几次,如果相等就基本可以判断是等价的表达式;
  2. 将表达式展开,判断各项是否相等。

第一种方法实现起来不难,查找 a 并替换成数字即可。

对于第二种方法,我们可以用一个数组 co 来表示一个多项式。co[i] 表示 ai 的系数。所以 co[0] 表示的就是常数项,co[1] 表示一次项的系数,以此类推。这样一来四则运算不成问题。问题的纠结之处在于 co 数组开多大合适。我是看了数据之后才发现居然有 ^5^10 这样逆天的运算。所以把 co 数组大小开到了 200 就 AC 了。

注意两种方法得到的中间结果都有可能爆 long long,所以最好要 mod 一个比较大的数。

noip2005提高组题解的更多相关文章

  1. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  2. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  3. NOIP 2001 提高组 题解

    NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...

  4. NOIP 2000 提高组 题解

    NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...

  5. 【NOIP2018】提高组题解

    [NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕

  6. NOIP2005提高组 过河

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  7. [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金

    题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...

  8. [NOIP2005] 提高组 洛谷P1054 等价表达式

    题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...

  9. [NOIP2005] 提高组 洛谷P1053 篝火晚会

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...

随机推荐

  1. Linux 操作Mysql详解

    一.引言 想使用Linux已经很长时间了,由于没有硬性任务一直也没有系统学习,近日由于工作需要必须使用Linux下的MySQL.本以为有 Windows下使用SQL Server的经验,觉得在Linu ...

  2. sgu 138

    自己猜测了一下  按比赛次数 从大到小排  然后类似于模拟 先排胜的场次 当只剩一场 将它定义为败 #include <cstdio> #include <cstdlib> # ...

  3. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  4. poj 3735 Training little cats(矩阵快速幂,模版更权威,这题数据很坑)

    题目 矩阵快速幂,这里的模版就是计算A^n的,A为矩阵. 之前的矩阵快速幂貌似还是个更通用一些. 下面的题目解释来自 我只想做一个努力的人 @@@请注意 ,单位矩阵最初构造 行和列都要是(猫咪数+1) ...

  5. POJ 3104

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7959   Accepted: 2014 Descriptio ...

  6. POJ 3461 Oulipo(字符串匹配,KMP算法)

    题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...

  7. hdu 2177 取(2堆)石子游戏 博弈论

    由于要输出方案,变得复杂了.数据不是很大,首先打表,所有whthoff 的奇异局势. 然后直接判断是否为必胜局面. 如果必胜,首先判断能否直接同时相减得到.这里不需要遍历或者二分查找.由于两者同时减去 ...

  8. Java Socket 使用BufferedWriter和BufferedReader要注意readLine 以及换行标志的发送

    当接收的类使用的是BufferedReader,发送的类是BufferedWriter的时候,要注意发送的一行要有换行标识符. 请看下面一个例子,服务器接收不到客户端的信息. 服务器: import ...

  9. PKUSC 模拟赛 题解_UPD

    之前挖了两个大坑 一个是day1下午的第二题 另一个是day2上午的第五题 先说day1下午的第二题吧 我们显然不能O(n^2)的dp,所以我们只能算贡献 首先对于任意一个边界点而言,他对答案的贡献路 ...

  10. 毕向东JAVA视频视频讲解(第八课)

    继承的好处: 1,提高了代码的复用性. 2,让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承.不直接支持多继承,但对C++中的多继承机制进行改良. 单继承:一个子类只能有一个 ...