noip2005提高组题解
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 。这篇文章说得很好。总结起来如下:
建立两个栈:操作数栈和运算符栈。每次遇到数字就入栈,遇到操作符的情况下,如果该操作符的优先级高于栈顶操作符的优先级就入栈,否则就不断将操作数和栈顶操作符出栈计算值然后将值入栈,直到栈顶操作符的优先级低于当前操作符。注意对括号的特殊处理。我的处理方式是对于左括号让其入栈,如果遇到右括号就不断弹栈计算,直到遇到左括号,然后将左括号出栈,右括号也就不用入栈了。
然后,判断两个表达式是否等价有两种方法:
- 代入具体的值并计算,重复几次,如果相等就基本可以判断是等价的表达式;
- 将表达式展开,判断各项是否相等。
第一种方法实现起来不难,查找 a 并替换成数字即可。
对于第二种方法,我们可以用一个数组 co 来表示一个多项式。co[i] 表示 ai 的系数。所以 co[0] 表示的就是常数项,co[1] 表示一次项的系数,以此类推。这样一来四则运算不成问题。问题的纠结之处在于 co 数组开多大合适。我是看了数据之后才发现居然有 ^5^10 这样逆天的运算。所以把 co 数组大小开到了 200 就 AC 了。
注意两种方法得到的中间结果都有可能爆 long long,所以最好要 mod 一个比较大的数。
noip2005提高组题解的更多相关文章
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕
- NOIP2005提高组 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金
题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...
- [NOIP2005] 提高组 洛谷P1054 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
- [NOIP2005] 提高组 洛谷P1053 篝火晚会
题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到n.一开始,同学们按照 ...
随机推荐
- js异步加载 defer和async 比较
网上说法很多,很少一句话能总结清楚的,终于找到两句一针见血的描述,很到位: 相同点:都不阻塞DOM解析 defer :顺序:保证先后顺序.解析:HTML 解析器遇到它们时,不阻塞(脚本将被异步下载) ...
- 【BZOJ】【3275】Numbers
网络流/最小割 Orz了Jiry_2神犇,蒟蒻网络流建模什么的完全不会啊T_T 按奇偶性来分组实在太巧妙了……然后相关的点之间连边表示只能选其一,来求最小割…… /****************** ...
- STL中的单向队列queue
转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...
- Leetcode#79 Word Search
原题地址 依次枚举起始点,DFS+回溯 代码: bool dfs(vector<vector<char> > &board, int r, int c, string ...
- PHP之SQL防注入代码集合(建站常用)
SQL防注入代码一 <?php if (!function_exists (quote)) { function quote($var) { if (strlen($var)) { $var=! ...
- 【WCF--初入江湖】12 WCF与Ajax编程
12 WCF与Ajax编程 Ajax Ajax基本原理 AJAX技术的本质原理就是:使用 JavaScript 的 XMLHttpRequest 对象来直接与服务器进行通信. 通过这个对象,JavaS ...
- XML注入介绍--XXE,XEE,xpath等
XML注入指在请求的XML中插入攻击利用代码.根据不同的场景,可能会形成以下的漏洞形式: (1)XEE ----xml entity xpansion(xml实体膨胀,用于dos) 具体介绍:http ...
- OneAPM 技术公开课第二讲:开启性能为王的架构时代
「OneAPM 技术公开课」由应用性能管理第一品牌 OneAPM 发起,内容面向 IT 开发和运维人员.云集技术牛人.知名架构师.实践专家共同探讨技术热点.继北京站第一场火爆上演之后,第二场将于9月1 ...
- Ubuntu12.04 + 虚拟机VMware 9 + Secure CRT + EditPlus 本地C++开发环境搭建
1.1 软件准备 虚拟机VMware 9 Ubuntu 12.04 Secure CRT EditPlus 1.2 安装VMware 9与Ubuntu 12.04 这两个软件安装,按部就班,这里就 ...
- 表单插件——form
表单插件——form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的options对象获取服务器返回数据,调用格式如下: $(form). a ...