码迷,mamicode.com
首页 > 其他好文 > 详细

[总结+题解]20150729

时间:2015-07-29 21:16:19      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

1、总结

     今天依旧是NOIP难度,但是有些比较坑的地方,还好没有掉进去,总体发挥还行,第一题多想想可以做到AC的。

 

2、题解

<1> 转动棋盘chess ( TAG:BFS(25) / BFS+暴力判重(90) / BFS+Hash(100) )

技术分享

       这道题主体是搜索,相信应该没有什么其他的办法了。直接暴力搜索的话可得25分;这个时候需要用Hash判重;考虑16个位置,4个不同的数字,状态量非常大,无法承受,但是存在一种思路,可能从1到4枚举判断标准,即最先假设只看数字1在2*2范围内的情况,而2到4这12个格子的状态就不重要了,可以全部看成0,这样,整张地图仅剩下0或1,又二进制直接判断即可,4*2^16的状态量。

       我在考试的过程中完全没有考虑,直接用第i位的数字乘上2^i,明显是错误算法,但是依旧骗到了80分,应该是本题本身深度不够,所以导致难以遇到状态相同的情况。

 

<2>打鼹鼠 ( TAG:动规(40/60/100) / 树状数组(100) / ZKW线段树(100) )

 技术分享

      其实最近的动态规划有一个相同的特征,相对来说有明显的动规迹象。这道题原本写的动规,存在复杂度不同的多种算法:O(n*m),O(n*t),O(n)等等。那么这道题要注意的地方在于,在对鼹鼠排完序之后容易发现,其t数组必定单调,故在动规的时候,可以直接省一个维度。

 

<3> 子段和 ( TAG:前缀和(0) / 前缀和+优化(30) / 奇偶判断(100) )

技术分享

      题目本身容易看懂,相信把数据弄小,谁都会做。首先谈谈前缀和的暴力算法,提前预处理很重要,首先就O(n*m)求出每个数是否存在以及记录当前左右端点位置,然后O(m)查询,30分可得;然而有部分人直接O(n*m^2),简直虐心啊!

       但是我们注意到,虽然题意明确,但是相比普通的求目标子段和,这道题有一项特殊性——由1和2组成。有什么特性?容易想到奇偶数。首先同样我们需要预处理出前缀和,由于数组内均为正数,故sum数组单调递i增。对于第x次询问,要求数值为k,我们先找到sum[i]<=k<sum[i+1],若sum[i]==k,直接输出;若sum[i]<k,由于数组仅存在1,2,若sum[i]<k,则sum[i]=k-1;设置head,tail 两个指针,当存在一个数字为1时,加上即可满足;否则当两个指针均为2时,向右平移一次,直到找到1。

       这道题不存在什么算法,就考数学思维了。

[总结+题解]20150729

标签:

原文地址:http://www.cnblogs.com/jinkun113/p/4687279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!