day2基础算法-曹利国-noip培训.ppt

  1. 1、本文档共187页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图3 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 分析 如果精确到小数点后两位,可用简单的枚举法:将x从-100.00 到100.00(步长0.01) 逐一枚举,得到20000个 f(x),取其值与0最接近的三个f(x),对应的x即为答案。而题目已改成精度为小数点后4位,枚举算法时间复杂度将达不到要求。 直接使用求根公式,极为复杂。加上本题的提示给我们以启迪:采用二分法逐渐缩小根的范围,从而得到根的某精度的数值。 具体方法如下: 分析 A、当已知区间(a,b)内有一个根时,用二分法求根,若区间(a,b)内有根,则必有f(a)·f(b)0。重复执行如下的过程: (1)若a+0.0001b或f((a+b)/2)=0,则可确定根为(a+b)/2并退出过程; (2)若f(a)* f((a+b)/2)0,则由题目给出的定理可知根在区间(a,(a+b)/2)中,故对区间重复该过程; (3)若f(a)* f((a+b)/2)0 ,则必然有f((a+b)/2)* f(b)0 ,根在((a+b)/2,b)中,对此区间重复该过程。 执行完毕,就可以得到精确到0.0001的根。 分析 B、求方程的所有三个实根 所有的根的范围都在-100至100之间,且根与根之差的绝对值=1。因此可知:在[-100,-99]、[-99,-98]、……、[99,100]、[100,100]这201个区间内,每个区间内至多只能有一个根。即:除区间[100,100]外,其余区间[a,a+1],只有当f(a)=0或f(a)·f(a+1)0时,方程在此区间内才有解。若f(a)=0 ,解即为a;若f(a)·f(a+1)0 ,则可以利用A中所述的二分法迅速出找出解。 如此可求出方程的所有的解。 分治的应用(求方程的根) 例题2: 输入m,n,p,a,b,求方程f(x)=mx+nx-px=0在[a,b]内的根。m,n,p,a,b均为整数,且ab;m,n,p都大于等于1。如果有根,则输出,精确到1E-11;如果无方程根,则输出“NO”。 【样例】 equation.in equation.out 2 3 4 1 2 1.5071265916E+00 2.9103830457E-11 分析 由于f(x)单调递增函数,对于一个单调递增(或递减)函数,判断在[a, b]范围内是否有解,解是多少。常用的一种方法叫“迭代法”,也就是“二分法”。先判断f(a)·f(b)≤0,如果满足则说明在[a, b]范围内有解,否则无解。如果有解再判断x=(a+b)/2是不是解,如果是则输出解,结束程序,否则我们采用二分法,将范围缩小到[a, x)或(x, b],究竟在哪一半区间里有解,则要看是f(a)·f(x)0还是f(x)·f(b)0。 对于y x,我们需要用换底公式把它换成exp(xln(y)) ? 分治的应用(分段处理) 例题3:取余运算(mod.exe) 输入b,p,k的值,编程计算bp mod k的值。其中的b,p,k*k为长整型数。 【输入输出样例】 mod.in 2 10 9 mod.out 2^10 mod 9=7 分析 1、用高精度计算比较烦 2、转而用其他方法求解 (1)取模运算的一个规律:a*b mod k=(a mod k)*(b mod k) mod k (2)运用规律可以把样例数据分解:b19=b2*9+1=b 9b9b,其中的指数9可以继续分解为2×4+1,4再分解程2×2+0,2=1×2+0,1=0×1+1。反过来,我们可以从0出发,通过乘以2再加上1或0推得1,2,4,9,19,然后依次以这些数为指数的自然数除以k的余数。 分析 (3)不难看出,前面乘以2后要加上的1或0就是该数对应二进制数各位上的数字1或0。如,19=(10011)2 。求解的过程也就是将二进制数还原为十进制数的过程。 (4)综上所述,该题可采用分治得思想进行递推求解。 分治的应用(分段处理) 例题:求“逆序对”。 给定一整数数组A=(A1,A

您可能关注的文档

文档评论(0)

精华文档888 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档