穷举法-吴建锋-2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
绍兴ห้องสมุดไป่ตู้桥中学吴建锋
一个有趣的问题
• 现有题号称爱因斯坦出的智力题全世界只 有2%能够做出。 1、在一条街上,有5座房子,喷了5种颜色。 2、每个房里住着不同国籍的人 3、每个人喝不同的饮料,抽不同品牌的香 烟,养不同的宠物 • 问题是:谁养鱼?
绍兴柯桥中学吴建锋
已知
– – – – – – – – – – – – – – – 1、英国人住红色房子 2、瑞典人养狗 3、丹麦人喝茶 4、绿色房子在白色房子左面 5、绿色房子主人喝咖啡 6、抽Pall Mall 香烟的人养鸟 7、黄色房子主人抽Dunhill 香烟 8、住在中间房子的人喝牛奶 9、 挪威人住第一间房 10、抽Blends香烟的人住在养猫的人隔壁 11、养马的人住抽Dunhill 香烟的人隔壁 12、抽Blue Master的人喝啤酒 13、德国人抽Prince香烟 14、挪威人住蓝色房子隔壁 15、抽Blends香烟的人有一个喝水的邻居
procedure try(i:byte); var c:char; begin if i=n+1 then write(t:n+2) else for c:='A' to chr(64+m) do if not(c in s) then begin t:=t+c;s:=s+[c];try(i+1); delete(t,length(t),1); s:=s-[c]; end; end;
绍兴柯桥中学吴建锋
时间复杂度分析
• 最外层需要5次,里面每层也是5次,一共5 层循环,总时间复杂度为O(5^5)。
绍兴柯桥中学吴建锋
破碎的项链
• 有一条有n个白色、红色或蓝色的珠子组成 的项链(3<=n<=350),珠子一开始是随 意安排的,下面是n=29的两个例子。其中 的r表示红色,b表示蓝色,w表示白色。
绍兴柯桥中学吴建锋
时间复杂度
• O(N^2+NLogN)
绍兴柯桥中学吴建锋
算法-2
• 生成法求解所有满足条件的真分数 • 1、用数组a[I]保存以I为分母的分子,一开始都 为1,表示的分数有1/2,1/3,1/4,。。。,1/n • 2 、在所有真分数中查找值最小的分数输出 a[y]/y • 3、产生下一个分母相同分子不同的分数,因为刚 才a[y]/y已经输出所以可以覆盖掉。方法是 inc(a[y]) • 4、判断新产生的分数是否为既约真分数,若是则 转2,否则执行inc(a[y])产生下一个分母相同的 分数。
绍兴柯桥中学吴建锋
• 题目意思很简单,就是统计0~9的每个数在 M~N之间的每个数的每一位上出现的次数 总和。 • 这题采用枚举法既可解决。 • 我们枚举每一个数,对这个数的每一位上 的数字做相应的累加。
绍兴柯桥中学吴建锋
一种改进的思路
• 1、枚举每个m-n之间的整数i,如果i+1没有 产生进位,则length(i)-1位前面的每个数 字个数都增加1,最后是length(i)位上的数 字的后继数字增加1。 • 2、如果产生进位,那么判断进位结束的位 置号k(因为可能会连续进位),然后在前 面数值对应的前k-1位上数字个数都增加1, 而后面数字的后继数字个数都增加1 • 3、效率会提高,但编程复杂度会提高。
绍兴柯桥中学吴建锋
循环生成并输出
• • • • • • • • • • • • • • while a[n]<n do 为前面某些分母小的分数可能会先行满 begin 足条件a[sy]=sy,这里是需要跳过的。 i:=2; while a[i]>=i do inc(i); sx:=a[i];sy:=i; for j:=i+1 to n do {通过两两比较求得一个值最小的 a[j]/j} if sx*j>sy*a[j] 如果生成的新分数不是既约真分数, 输出a[sy]/sy之后,这个分数已 then begin 那么不断让分子加1,直到产生一个 经不必保存了,我们就让分子 sx:=a[j];sy:=j; 合法分数或者分子等于分母为止。 加1,以生成坟墓相同的下一个 end; 分数。 writeln(sx,'/',sy); inc(a[sy]); while (make(a[sy],sy)<>1)and(a[sy]<sy) do inc(a[sy]); end;
绍兴柯桥中学吴建锋
• SAMPLE INPUT (file frac1.in) 5 • 每个分数单独占一行 • SAMPLE OUTPUT (file frac1.out) 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5
绍兴柯桥中学吴建锋
算法-1
• 1、仔细回忆有关穷举法设计要点:要求什 么就枚举什么。 • 2、要求的是满足条件的分子和分母,我们 就枚举这两个解分量,然后对枚举出的每 对数值进行判断是否是真分数(两个条件, 1是两者互质,2是分子小于分母) • 3、对于满足真分数条件的所有对数,运用 快速排序进行升序排序,最后输出排序结 果。
绍兴柯桥中学吴建锋
利用堆维护的算法描述
• 1、建堆。 • 将初始化的分数1/2,1/3,1/4。。。建成一个合法 堆。 • 2、输出堆顶元素。 • 3、根据堆顶元素生成合法分数并插入堆中 • 4、重复上述2-3步,直到a[n]=n。 • 建堆的复杂度为O(NLogN),生成分数并输出的 复杂度为O(KLogN),总的时间复杂度是 O(NLogN)+ O(KLogN) ,由于N小于K,所以复 杂度还是降低了 。
绍兴柯桥中学吴建锋
• 5、整个处理何时结束? • (1)既然我们采用生成法,而且按照升序 输出,那么显然最后输出的必定是(n-1)/n。 • (2)所以,重复生成分数并输出的结束条 件是“输出了(n-1)/n”。
绍兴柯桥中学吴建锋
输入部分
• readln(n); • for i:=1 to n do a[i]:=1; • 所有的分子一开始初始化为1.
绍兴柯桥中学吴建锋
数字个数
• Bessie was daydreaming one day as she drifted between wakefulness and that delicious drowsiness that we all feel when we are tired. For a moment, she counted sheep as couldn't quite sleep. Bessie's mind is razor sharp and visualizes the numbers as she counts. She started noticing the digits and wondered: how many instances of each digit appear in a counting sequence?
绍兴柯桥中学吴建锋
判断既约分数的函数
• function check(m,n:integer):integer; • begin • if n=0 then check:=m else check:=check(n,m mod n); • end; • 运用辗转相除法求分子和分母的最大公约 数,如果求得为1就是互质的,否则就存在 约数,说明不是既约分数。
绍兴柯桥中学吴建锋
时间复杂度分析
• 1、假定共有K个满足条件的分数,那么外循环次数就是K, 而内循环(顺序查找分子小于分母的分数)次数最坏情况 是n,所以时间复杂度大致为O(KN),这里没有考虑求最 大公约数的时间。当K特别大时时效较差,而且肯定是超 过O(N^2)的。 • 2、由于需要不断在一个已知序列中查找最小值,考虑采 用“堆”维护这个序列,这样可以把查找最小分数的时间降 到O(1),而输出一个分数然后自从堆中删除该分数的复杂 度是O(LogN)。另外,当生成一个新得合法的分数后,我 们需要将其插入堆中,这个过程和前面删除后的维护结合 起来。
绍兴柯桥中学吴建锋
要求
• 设计一个程序,使得其能推理出正确的答案 (哪个人养鱼)?
绍兴柯桥中学吴建锋
算法分析
• 1、回忆“5人说话2句问题”和“侦探推理”的问题模型 • 2、本题可用穷举法求解,关键是抓住穷举法设计关键“要 求什么就穷举什么”,本题要求谁养鱼,我们就枚举每个 人,然后? • 3、算法描述 • (1)枚举每个人,内部再枚举该人可能的外部特征(房 子颜色,饮料种类,香烟牌子,养何种宠物),所以共需 5层循环嵌套。 • (2)在循环核心部分,用15个条件判断枚举出的情况是 否矛盾,若矛盾则枚举下一个人,否则输出当前枚举的人, 就是问题的答案。
绍兴柯桥中学吴建锋
快排子程序
• • • • • • • • • • • • • • • • • • • • var temp:real;i,j,t:integer; begin if st>=ed then exit; temp:=a[st].x/a[st].y; i:=st-1;j:=ed+1; while i<j do begin repeat inc(i) until a[i].x/a[i].y>temp; repeat dec(j) until a[j].x/a[j].y<temp; if i<j then begin t:=a[i].x; a[i].x:=a[j].x; a[j].x:=t; t:=a[i].y; a[i].y:=a[j].y; a[j].y:=t; end; end; qsort(st,j);qsort(j+1,ed); end;
绍兴柯桥中学吴建锋
顺序分数
• 输入一个自然数N 请写一个程序来增序输出分母小于等于N的 既约真分数 • PROGRAM NAME: frac1 • INPUT FORMAT 单独的一行 一个自然数N(1..1600) • OUTPUT FORMAT 分母小于等于N的既约真分数,每个分数单 独占一行.
绍兴柯桥中学吴建锋
筛选出分数并保存
• • • • • • k:=0; for i:=1 to n do for j:=1 to i-1 do if check(i,j)=1 then begin inc(k);a[k].x:=j;a[k].y:=i;end; qsort(1,k); 其中i表示分母,j表示分子。
绍兴柯桥中学吴建锋
• Write a program to answer this question. Given two integers M and N (1 <= M <= N <= 2,000,000,000 and NM <= 500,000), how many of occurences of each digit appear? • Consider the sequence 129..137: 129, 130, 131, 132, 133, 134, 135, 136,137. Count the digits to find: • 1x0 1x5 • 10x1 1x6 • 2x2 1x7 • 9x3 0x8 • 1x4 1x9
穷举法-2
绍兴柯桥中学 吴建锋 绍兴柯桥中学吴建锋
一些应该彻底搞清的概念
• • • • 1、严格意义上的穷举法 2、递归结构的穷举法 3、回溯法 4、深度优先搜索法
绍兴柯桥中学吴建锋
字母排列的递归程序
• t:='';s:=[]; • try(1);
绍兴柯桥中学吴建锋
• • • • • • • • • • • •
绍兴柯桥中学吴建锋 顺序查找一个分子小于分母的分数。因
细节分析
• 输出(n-1)/n之后(a[sy]=n-1,sy=n),程序终 止的过程是如何的? • 输出之后,首先会让a[sy]加1,得到a[sy]=n, 此时下面循环第二个条件不满足退出,再 次判断外循环时,由于a[sy]=sy,所以整个 循环就结束。
绍兴柯桥中学吴建锋
• 1 2 1 2 • r b b r b r r b • R b b b • r r b r • r r w r • b r w w • b b r r • b b b b • b b r b • r r b r • b r r r • b r r r • r r r b • r b r r r w • 图1 图2 • 为了表示方便,我们需要给项链中的珠子位置编号,然后按照这个编 号输入项链数据,如图1中的项链可用字符串如下表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb。图中的1和2号珠子已经作了记号。
相关文档
最新文档