| | 网站首页 | USACO译题 | 编程语言 | 算法艺术 | 数据结构 | 竞赛试题 | oier天地 | 历史荣誉 | 相关软件 | 学校网站 | 留言本 | | |
![]() |
|
| 站内导航: 温中信息学竞赛 >> 算法艺术 >> 其它算法 >> 文章正文 |
|
|||||
| 筛法的应用 | |||||
| 作者:大榕树 文章来源:www.mydrs.org 点击数: 更新时间:2005-7-27 | |||||
|
例: 传说中有一个残暴的国王,喜欢杀戮百姓。有一次,他抓到30个百姓并要一一杀掉。在这30个百姓中间有一个聪明人,他站出来对国王说:“请国王大发慈悲,赦免二人不死。”国王问:“赦免哪二人不死?”那个聪明人回答说:“我们30个人围成一圈,从1开始报数,凡数到5的人就拉出去杀掉。剩下的人继续从1开始报数,循环反复,直到剩下两个人为止,这两个人被赦免。” 国王一听很有意思,采纳了聪明人的建议,赦免了两个人,而那个聪明人就是其中之一。请你设计一个程序,由计算机判断聪明人要站在什么位置,才能躲过这一场屠杀。 问题分析: 首先,设百姓的人数为M人,设数到N的人被杀掉。 用数组A(M)存放M个人是否还在圈中的信息。其中, A(I)=1 表示第I个人还在圈中。 A(I)=0 表示第I个人已被杀掉。 开始时,数组A中所有的元素都是1,表示每个人都站在圈中。 用K=K+A(I)来实现报数功能,因为只有还在圈中的人才能使K的值增加。 用变量D来记录出圈的人数,当D=M时,表示所有的人都出圈了。最后出圈的两个人就是被赦免的人。 程序清单: CLS INPUT "m="; m: INPUT "n="; n DIM a(m) FOR i = 1 TO m: a(i) = 1: NEXT i d = 0: k = 0 DO FOR i = 1 TO m k = k + a(i): IF k <> n THEN GOTO 1 PRINT USING "####"; i; : p = p + 1: IF p > 5 THEN p = 0: PRINT a(i) = 0: k = 0: d = d + 1 IF d = m THEN END 1 NEXT i 例二: 请你设计一个程序,让计算机找出40个自然数来,使得其中任意两个数之差均不相等。 问题分析: 首先,开辟一个数组S(I),准备存放这40个数,再开辟一个数组CHA(I),用来存放两个数的差。 寻找某一个满足条件的自然数的过程如下: 把1和2放进数组S中; CLS INPUT "n="; n DIM s(n), cha(3000) s(1) = 1: s(2) = 2 cha(1) = 1: s = 2: y = 2: PRINT 1, 2, 1 : y = y + 1 FOR k = 1 TO s PRINT k, y, s(k), cha(y - s(k)) IF cha(y - s(k)) = 1 THEN GOTO 1 NEXT k s = s + 1: s(s) = y FOR k = 1 TO s - 1 cha(y - s(k)) = 1 PRINT y - s(k), cha(y - s(k)) NEXT k PRINT y, : IF s < n THEN GOTO 1 |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 管理登录 | |
|
温州中学信息学竞赛组 本站资料多从网络收集,若有版权问题,请联系! 站长:舒老师 (办)0577-86786615 |