2016.08.11【初中部 NOIP提高组 】模拟赛C

来源:互联网 发布:有些源码上传会失败 编辑:程序博客网 时间:2024/05/20 23:05

T1:采药2

采药1是很明显的01背包,而采药2只是将N,m范围扩大到10^5,题目并没做多少改动.


因为n,m扩大了,但是每个背包的时间和价值都减少了,在[1..10]的范围内.


所以,我们可以以时间和价值做优化.


这里讲述其中一种方法:

因为背包的时间价值都小于等于10,所以总共最多只有10^2种互不相同的时间价值.

我们对于时间价值都相同的记录好后,就可以把01背包改成多重背包.


所以,我们可以优化一下多重背包.


对于一个背包,设有x个这样相同的背包.

则x一定可以表示为

2^0+2^1+2^2+……+2^lg(x)(有可能x会大于2^lg(x),则用x减去2^0+2^1+2^2+.......+2^lg(x) 的差作为最后一个表示的数即可)


把x能表示的数记录好后,我们则可以对这些所有记录好的数进行01背包求解,则可知时间复杂度最差时为O(lg(m)*m)



T2:方格取数

很明显的DP,计算一个点的最少‘0’个数,很明显就是这个点的上方和左面两点所与这点相乘所能得到的最小值即可。


(但貌似这道题的数据有问题,我觉得90分的做法才是正确的...我并不知道我考试时是怎么AC的,如果我考虑到这种“正确”的情况应该只有90分....数据....)



T3:统计

非常简单的找规律,递推公式:

f[i,j]:=f[i,j-1]+f[i-1,j]-f[i-1,j-i]


T4:直角三角形


如果用普通的O(n³)的方法,只能拿30分,而O(n²)也只能50,所以可以进一步考虑.


我们可以直接枚举两个点,然后枚举两个点,所在的列上顶点的个数-2则为这两个点所能贡献的答案.

但是由于坐标是<=2^32,所以,我们需要把列坐标的个数压一下位,压成一堆类似叫做连成的数(优化空间)想要压成一堆这样的数,肯定要先排序再做一大堆复杂的操作,这个请自行思考.


压了列坐标之后,则可把行坐标排个序,然后直接枚举两个行相等的点,如果行不相等则可直接break(优化时间)


这样记录答案即可.


这套比赛总结:

第二题和第三题考试时都刷了,不错,表扬下自己...

但是,但是,第4题还是没有认真往下思考一下,应该不是时间的问题,这次考试时间很充足,只是没有利用好,第2题改了4次,第一次动归,感觉动归不行,又改成bfs,发现bfs爆栈,改成循环队列数组开到最大还是过不了20*20,顿时还想了想双向bfs(事实证明我是渣啊)想了双向bfs大概20分钟,又觉得无处可下, 于是又改成dfs,发现Dfs加了个与打的bfs同样的优化,30*30竟然秒过,就没心思继续往下出数据了(事实证明下次应该打个类似对拍的东西吧,我是蒟蒻,不知道高级对拍怎么打,只知道用文件输入输出判断...)


而第一题确实是考试时想不到的一个性质,只能怪智商不足咯...


希望下次能进继续努力...

1 0