

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、猜数解题市复旦附中问题描述 见 2006 年冬令营试题第一题算法分析对于猜数问题,自然想到了筛法:一开始,所有的数都未被筛去。对于每一步,总是猜最小的未被筛去的数 A,得到 P 与 Q,并将该数与其它未被筛去的数进行比较,设与 B 比较时,得到 P1 与 Q1。显然,当 P1P 且 Q1Q 时,B 并不满足条件,将其筛去。一直重复这样的过程,直到 P 与 Q 均为 L。但是,这种朴素的想法在实现上遇到了两个问题:1.在待猜数长度较大时,朴素的筛使猜每个数的平均次数比最有此数大许多。2.由于待猜数最多可能有 10!=3628800 个,不恰当的枚举方法和程序超时。结构可能会使对于第一个问题,可以
2、利用在启发式搜索上得到广泛应用的估价函数,对每一个未被筛去的数 A,设它与未被筛去的数中的 Sp,q 个数比较得到 p 与 q,经过试验,了一个效果较好的估价函数:S=(Sp,q)2只要取所有数中使到 S 最小的数,就可以减少猜测的次数。得到,问题又接踵而至,在使用估价函数的过程中,每次猜测时间复杂度由 O(n)扩大到了 O(n2),使问题二变得更加严重了。但经过一些思考后发现,由于未被筛去的数的规模在几次猜测后便会急剧缩小就可以加快运行速度。只需在规模不大于 1000 个数时再使用估价函数,对于第二个问题,由于 L 是确定的,可以在预处理时用数组 rec下满足条件的所有数,并在每次猜测后用另
3、一个数组 rec2下未被筛去的数,由于 rec 可以反复利用而rec2 可以使每次猜测的复杂度大大降低。通过这两个优化,完全可以在时间范围内出解。总结猜数问题是一道多次出现在各种竞赛上的题,虽说这次待猜数的长度扩大到 10,但猜数问题的精髓筛法依然是解决这道题的关键。在无需任何优化的情况下,筛法就可以得到 70 分以上的高分。所以在遇到这类扩大范围的经典题目时, 首先要借鉴原题的经典方法,然后尽自己所能进行优化,这样才能得到一个满意的成绩。参考程序uses guesslib_p; varcould:array0.3628801 ofrec:array0.3628801,0.9 of;short
4、;rec2:array0.2000001,0.9 of short;l,p1,q1,all,i,j,k,now,rest,num,num2,tr,min,now2,t,d,st:long;p,q:eger;a,b:tnumber; used,used2,have:array0.9 oftypenum:array0.10,0.10 of long;over,ov2:procedure grid; var;j1:longbegin;p1:=0; q1:=0;for j1:=0 to l-1 do if aj1=bj1 then p1:=p1+1;if p1p then begin couldi:=
5、false; exit;end; fillchar(have,sizeof(have),false); if l=9 thenbeginfor j1:=0 to l-1 do haveaj1:=true; for j1:=0 to l-1 do if havebj1 thenq1:=q1+1;end else q1:=q;if (p1p) or (q1q) then couldi:=false;end;procedure solve; begin trynumber(a,p,q);if (p=l) and (q=l) then beginnext; ov2:=true; exit;end; f
6、illchar(could,sizeof(could),true); for i:=1 to num dobeginfor j:=0 to l-1 do bj:=rec2i,j; grid;end;num2:=0;for i:=1 to num do if couldi then beginnum2:=num2+1;for j:=0 to l-1 do rec2num2,j:=rec2i,jend; num:=num2; end;begin l:=len;all:=1;for i:=10 downto 11-len all:=all*i;for i:=0 to l-1 do beginbi:=
7、i;rec1,i:=i; usedi:=true; end;for i:=2 to all do beginnow:=l-1; over:=false; usedbnow:=false; while not over do beginbnow:=bnow+1; over:=true;if bnow9 then begin over:=false;now:=now-1;dousedbnow:=false; end;if (over) and (usedbnow) then over:=false;end; usedbnow:=true; rest:=0;for j:=now+1 to l-1 d
8、o beginwhile usedrest do rest:=rest+1;bj:=rest; usedrest:=true; end;for j:=0 to l-1 do reci,j:=bj;end;while true do begin ov2:=false;fillchar(used,sizeof(used),false);p1:=0; q1:=0; i:=0; j:=0; k:=0; now:=0; rest:=0; num:=0; num2:=0;tr:=0; min:=0; now2:=0; t:=0; d:=0; st:=0; p:=0; q:=0; over:=false;
9、for i:=0 to l-1 doai:=i; trynumber(a,p,q);if (p=l) and (q=l) then beginnext; continue; end;fillchar(could,sizeof(could),true); for i:=1 to all dobeginfor j:=0 to 9 do bj:=reci,j; grid;if couldi then begin num:=num+1;for j:=0 to l-1 do rec2num,j:=bj;end; end; d:=1;while num=1000 do beginif d9 then a0
10、:=a0-10; fillchar(used2,sizeof(used2),false);used2a0:=true;for k:=1 to l-1 do beginak:=ak-1+d;while (used2ak) or (ak9) beginif ak9 then ak:=ak-10else ak:=ak+1;end; used2ak:=true; end;end elsefor k:=0 to l-1 do ak:=rec21,k;solve;if ov2 then break; end;if ov2 then continue; while true dobegindomin:=ma
11、xlongtr:=0;for i:=1 to num do beginfillchar(typenum,sizeof(typenum),0); for k:=0 to l-1 doak:=reci,k; for j:=1 to num do beginfor k:=0 to l-1 do bk:=recj,k; p1:=0; q1:=0;for k:=0 to l-1 do if ak=bk then p1:=p1+1;fillchar(have,sizeof(have),false); for k:=0 to l-1 do haveak:=true;for k:=0 to l-1 do if
12、 havebk then q1:=q1+1;typenump1,q1:=typenump1,q1+1; end;now2:=0;for j:=0 to l do for k:=0 to l donow2:=now2+typenumj,k*typenumj,k; if now2mhenbegin min:=now2; tr:=i; end;end;for i:=0 to l-1 do ai:=rec2tr,i; trynumber(a,p,q);if (p=l) and (q=l) then beginnext; break; end;fillchar(could,sizeof(could),true); fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年半导体用石英玻璃材料项目发展计划
- 绿色新能源发电技术研发投资合同
- 机房服务外包服务合同
- Picrinine-Standard-生命科学试剂-MCE
- Isoflavone-Standard-生命科学试剂-MCE
- 幼儿绘本绿野仙踪教案设计
- 贷款反担保协合同书
- 2025年铝锻压材项目建议书
- 2025年起动脚蹬杆项目合作计划书
- 股权有偿转让协议
- 2024年广东高考(新课标I卷)语文试题及参考答案
- XX卫生院关于落实国家组织药品集中采购使用检测和应急预案及培训记录
- 人教版八年级地理下册教材分析
- Part3-4 Unit4 Volunteer Work课件-【中职专用】高一英语精研课堂(高教版2021·基础模块2)
- 法律援助课件
- 粒籽源永久性植入治疗放射防护要求
- 双减政策之下老师如何打造高效课堂
- 新员工入职健康体检表
- 养老院行业现状分析-2023年中国养老院行业市场发展前景研究报告-智研咨询
- 广东省特种作业操作证核发申请表
- 胸腔穿刺知情同意书
评论
0/150
提交评论