NOIp 模拟测试解题报告(1)
第一题:给出一串已经拓扑好了的事件,求最短完成时间。
做滥了的题目啊,直接扫一边就出解,O(n)
第二题:给出第二周的歌曲排行榜和每首歌的歌曲排名变化(上升、下降、持平),求前一周的歌曲排行榜的一种可能解。
字符串处理的题目;
首先,我们把上升了的歌看作要把它往下移,而下降了的歌呢就看作要把它往上移,再把所有的持平歌去掉。
那么,现在的排行榜的首位肯定是下,而末位肯定是上了。
现在,找所有下一位是上的下节点。从这个下节点往上延伸到所有连着的下节点,而从这个上节点往下延伸到所有连着的上节点,把这两个模块互换即可。
第三题:你向银行贷款,告诉你你的贷款额、每月还款额和还款月数。求每个月的月利率(每个月银行先算利再让你还钱)
初以为这道题目十分简单,发现不然,这个题目列出来是个高次方程。其实是可以用log函数来解,但是对于有未知数的log函数,Pascal语言显得十分麻烦(几乎不可能实现)。所以,我在考试的时候使用了枚举的方法,得了60%的点。
但是我竟然忘记了世上有二分这样的好方法,其实,以你的总还款额/贷款额的利率(这个是绝对不可能达到的)为上界,下界为0,来二分求解,效果很好。但是虽然二分时间不超,但是发现有一个点竟然超过了int64和extended的届,呵呵。
第四题:走迷宫变形,有起始朝向,就是一秒钟内可以走1格、2格、3格,而且向左向右转也要耗费一秒。
爆容易的题目,难得写了。只有50×50的大小,不说广搜,深搜都能过啊。
课后孟LJ简单阐述了下搜索的优化,无非以下三种:
1、双向广搜(省时一半,较容易实现);
2、普通判断剪枝(子树);
3、估价函数剪枝(A*)。这种做法需要良好的估价能力,适合要打路径的题目。估价函数是一个可以求出从当前状态到目标状态的大概花费的函数,其值必须小于等于真实花费。所以,当走到一个(当前花费+估价花费>已知最小花费)的点时,完全可以把他的子树剪掉。这就是一种动态剪枝方法。效果甚佳,但本人未实现。