信息学奥林匹克竞赛辅导课件_归纳策略.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四节、模拟策略 在自然界和日常生活中,许多现象具有不确定的性质,有些问题甚至很难建立数学模型,或者很难用计算机建立递推、递归、枚举、回溯等算法。在这种情况下,一般采用模拟策略。 所谓模拟策略就是模拟某个过程,通过改变数学模型的各种参数,进而观察变更这些参数所引起过程状态的变化,由此展开算法设计。 模拟题没有固定的模式,一般形式有两种: (1) 随机模拟:题目给定或者隐含某一概率。设计者利用随机函数和取整函数设定某一范围的随机值,将符合概率的随机值作为参数。然后根据这一模拟的数学模型展开算法设计。由于解题过程借助了计算机的伪随机数发生器,其随机的意义要比实际问题中真实的随机变量稍差一些,因此模拟效果有不确定的因素。 (2)过程模拟:题目不给出概率,要求编程者按照题意设计数学模型的各种参数,观察变更这些参数所引起过程状态的变化,由此展开算法设计。模拟效果完全取决于过程模拟的真实性和算法的正确性,不含任何不确定因素。 由于过程模拟的结果无二义性,因此竞赛大都采用过程模拟。 模拟的解题方法一般有三种类型: (1)直叙式模拟 (2)筛选法模拟 (3)构造法模拟 一、直叙式模拟 直叙式模拟,即按照试题要求展开模拟过程。 编程者要忠实于原题,认真审题,千万不要疏漏任何条件,精心设计方便模拟的数据结构。 直叙式模拟的难度取决于模拟对象所包含的动态变化的属性个数,动态属性愈多,则难度愈大。 【例 19】约瑟夫问题 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。 Input:每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 m,n =300)。最后一行是:0 0 Output:对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号 Sample Input 6 2 12 4 8 3 0 0 Sample Output 5 1 7 解题思路1: 用数组loop来存放n个数,相当于n个数排成的圈,用整型变量nPtr指向当前数到的数组元素,相当于人的手指,划掉一个数就将该数置0,在数数时,要跳过为0的元素。当nPtr指向最后一个元素时再数下一个时则指向数组的头一个元素。 #includeiostream.h const int MAX=300; int loop[MAX]; void main() { int n,m,i; while (1) { cinnm; if (n==0) break; for(i=0;in;i++) loop[i]=i+1; int nPtr=0; for(i=0;in;i++) { int nCount=0; while(nCountm) { while(loop[nPtr]==0) nPtr=(nPtr+1)%n; nCount++; nPtr=(nPtr+1)%n; } nPtr--; if(nPtr0) nPtr=n-1; if (i==n-1) coutloop[nPtr]; loop[nPtr]=0; } } } 采用循环链表实现如下 #include iostream.h 采用循环链表实现 struct Monkey { int ID; Monkey *next; }; int main() { Monkey *link,*monkey,*lastMonkey; int n,m,count; cinnm; link=NULL; for(int i=0;in;i++) { monkey=new Monkey; monkey-ID=i+1; if (link==NULL) link=lastMonkey=monkey; else{ lastMonkey-next=monkey; lastMonkey=monkey;} } lastMonkey-next=link; count=1; while(link!=NULL) { if(link-next==link) { c

文档评论(0)

smdh + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档