- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
八中OJ刷题总结
八中OJ刷题总结序:在八中OJ刷题快一年了,自我感觉良好,已突破285,成功Rank.3。于是,在这NOIP来领之际,对我的刷题做一下总结,也是在为NOIP做准备。我的总结分几个部分,分别是对不同类型的题的一种总结,此总结仅是个人观点,不具有广泛性,主要用于与大家交流与学习,特写此序来作说明。The No.1:排序当我们一学完语法部分,甚至还没学完语法,老师就会教我们排序。最开始,是最基本的暴搜排序;然后,是相对优化后的冒泡排序和插入排序;接着,学了简单的分治后,是归并排序;接下来,学了树于堆的概念后,是堆排序;再后来,学了二叉树,是二叉排序;最后,是比较经典的运用分治思想的快速排序。在八中OJ上做了那么多关于排序的题,还是认为快速排序最好用,效率也最高,下面是我的快速排序的函数代码:Code:void mysort(int l,int r){ int i=l,k=r;//左右边界 int aa=x[(l+r)/2],t;//这里不一定是int,可以是结构体 while(i=k){ while(x[i]aa)i++; while(x[k]aa)k--; if(i=k){ t=x[i];x[i]=x[k];x[k]=t;//结构体同样用 i++; k--; } } if(lk)mysort(l,k); if(ri)mysort(i,r);}使用排序只需在main函数中写一句:mysort(l,r);// l表需要排序的左边,r表右边;虽然快速排序效率高,但在有的时候用冒泡或是插入就够了,注意灵活运用!The No.2:递推与递归语法学完了,但八中OJ上的题还是没刷几道,H老师说是没学算法,于是,我进入了算法的学习,最早学的,就是递推与递归。学了这一专题很久了,我一直没分清什么是递推,什么是递归,我不知道你是否也有这种感觉(虽然这对学习OJ的人没有多大关系),直到我学了数学竞赛中的数列已知递推式求通项,数学老师给了我递推与递归的概念,我终于分清了这两个东东。举两个例子:f(n+2)=f(n+1) - f(n);……①f(n+1)=f(n) +2^n+1;……②像①式那样,是只由前几项来推这一项,叫作递推,是由前N项得这一项就叫N阶递推;像②式那样,不只由前几项来推这一项,叫作递归,是由前N项得这一项就叫N阶递归。(明白了吧)在明白了递推与递归的区别与联系后,我在找到递归式后,都会用数学方法转化为简单的递归或是递推,这样就大大的提高了效率。好了,不吐了,在OI中,一旦将递归转化为递推,效率会大大提高。下面举一个实例:八中OJ1321 集合的划分。相信大家在看过“小红书”以后,都知道:s(n,k)=s(n-1,k-1)+s(n-1,k)*k; (nk,k0)s(n,k)=0; (nk)or(k= =0)s(n,k)=1; (k= =1)or(k= =n)这样的递归式,的确简单,也很好写,不过,函数的递归调用却是很费时的。此题的数据规模不大,可以0ms,但是,如果数据规模变大,岂不杯具了!所以,我想了一个用空间换时间的非递归方法,用二维数组来存每一个对应的s(n,k),先初始化一下,再用递推求解(类似于DP),呵呵,代码如下:Code:#include iostreamusing namespace std;int s[31][31];int main(){ int n,k,i,j; cinnk; for(i=1;i=n;i++){ s[i][1]=1; s[i][i]=1; } for(i=3;i=n;i++) for(j=2;ji;j++) s[i][j]=s[i-1][j-1]+j*s[i-1][j]; couts[n][k];}这在此题也许效果还不明显,但在有些题就不一样了,如1322直线的交点数,此题我就用了类DP的方法转递推,效率大大提高!还有,我要说明一点,我前面吐的关于数学的递推与递归在OI中也有很多应用,只是八中OJ上没有题,我就不多说了,你自己去悟吧!其实数学对OI的帮助很大,正如八中曾经的大牛——Matrix67。下面,我要重点谈一下数学在递推与递归中的应用——将递推式转通项。在有的题目中,递推式很明显或者很好求,程序代码也很好写,但是时间复杂度却高,或者空间不够开,这时,就要用到数学方法,求其通项,再来求解。一般的,通项都是一些整数的幂,求它如果同递推时间复杂度并没降低,只是少用空间,这是可用二份快速幂来求解,时间和空间都大大降低,这样的感觉是不是很好呀!下面列举一例:八中OJ1005 三个袋子。相信大家都可以知道:相当于把n个不同的元素分成三堆,可以有空堆,假定共有Xn种分法。显然,可以分类计算。①分成一堆:只有一种;②分成两堆:设有An种;③分成三堆:设有Bn种。于是有:Xn=An+Bn+1;又有An=2^(
文档评论(0)