- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2枚举与模拟算法
例题1、酗酒的狱警。某监狱里有个很长的走廊,走廊中一个接一个地有n个房间。每个房间中锁着一个犯人。一天夜里,狱警决定玩一个无聊的游戏。第一轮中,他喝了一口威士忌,然后打开每个房间。第2轮,他喝了一口威士忌,然后按2的倍数遍历每个房间。第3轮,他又喝了一口威士忌,遍历所有3的倍数的房间,以此类推。在遍历中,如果房间是锁着的,则打开;否则锁上。他这样重复n轮,最后醉酒。这时有些囚犯看到自己的房间所被打开了,他们立即逃跑。对于有n个房间的走廊,最终会有多少个囚犯逃脱? program yujing; var num,s,n,m,i,k,j:integer; ??? a:array[0..200] of boolean; begin ??? readln(num); ??? for i:=1 to num do ??? begin ??????? readln(n); ??????? fillchar(a,sizeof(a),true); ??????? for j:=1 to n do ????????? for k:=1 to n do ??????????? if k mod j=0 ????????????? then a[k]:=not a[k]; ??????? s:=0; ??????? for j:=1 to n do ????????? if a[j]=false then inc(s); ??????? writeln(the last is:,s); ??? end; end. 例3、分发糖果。一些学生围绕老是坐着,每人手里都有偶数个糖。现在老师吹一声哨子,所有同学同时将自己的一半糖果给他右边的同学,如果某个同学手里的糖果个数是奇数,则老师给他一个糖果,重复这个过程直到所有同学手中的糖果数一致。 写一个程序判断老师要吹多少下哨子,每人手中的糖果数才能一致,并给出结束后每人手里的糖果数。 program fatang;const maxn=100000;type arr=array[0..maxn] of longint;var a:arr;n,i,total,sum:longint; procedure check(a:arr;n:longint);? {计算吹哨子次数和最终糖果数}var i,p,q,j,k:longint; function eq(a:arr;n:longint):boolean; {判断每人的糖果数是否相等}var i:longint;begin? i:=1;? while (in) and (a[i]=a[i+1]) do??? inc(i);? if i=n then eq:=true else eq:=false;end; begin? while not eq(a,n) do? {如果每人糖果不等,则继续分配}? begin??? inc(total);??? {吹哨子数增加一次}??? q:=a[n];??? for i:=1 to n do?? {重新分配}??? begin????? p:=a[i];????? a[i]:=q div 2+a[i] div 2;????? q:=p;??? 2. 模拟算法策略 【例2】:有一个圆盘,盘内存有36个槽,当一个小球在盘内滚动 时,可能落入任一槽内,这些槽的编号分别为1-36,其中槽号为奇 数时为红色,槽号为偶数时为黄色,编一个程序模拟球滚动100次, 计算落入每个槽中的次数及落入红槽、黄槽各有多少次。 算法分析: 数组a[1]…a[36] 落入每个槽中的次数; X:随机落入槽号 T: 落入黄槽的次数 S:落入红槽的次数 X:=random(36)+1 【参考程序】 program moni1; var a:array[1..36] of integer; x,t,s,i:integer; f:boolean; begin randomize; t:=0; s:=0; for i:=1 to 36 do a[i]:=0; for i:=1 to 36 do begin x:=random(36)+1; f:=odd(x); if f then s:=s+1 else t:=t+1; a[x]:=a[x]+1; end; for i:=1 to 36 do writeln(i,a[i]:5); writeln(red=,s, yelllow=,t); end. ?? if odd(a[i]) then????? begin??????? inc(a[i]);??????? inc(sum);??? {如果是奇数,老
文档评论(0)