收藏 分享(赏)

计算机语言与程序设计 (8).ppt

上传人:wspkg9802 文档编号:8241162 上传时间:2019-06-16 格式:PPT 页数:29 大小:90.50KB
下载 相关 举报
计算机语言与程序设计 (8).ppt_第1页
第1页 / 共29页
计算机语言与程序设计 (8).ppt_第2页
第2页 / 共29页
计算机语言与程序设计 (8).ppt_第3页
第3页 / 共29页
计算机语言与程序设计 (8).ppt_第4页
第4页 / 共29页
计算机语言与程序设计 (8).ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、1,贪 心 法,2,包含N个时间不重叠事件的数目称为序列 的长度,编程求最长序列.数据如下:,3,事件有如下12个:事件号 # 0 1 2 3 4 5 6 7 8 9 10 11发生时刻 1 3 0 3 2 5 6 4 10 8 15 15结束时刻 3 4 7 8 9 10 12 1415 18 19 20,4,0 1 2 3 4 5 6 7 8 9 10 110 1 2 3 4 5 6 7 8 9 11 13 15 17 19 10 12 14 16 18 20,5,a 和 b 事件的开始时刻小于结束时刻Begina= Enda记为 b a这时 b 事件与 a 事件不重叠.,6,找出 时间上

2、不重叠的事件:2#,9#2#,8#,10#2#,8#,11#0#,3#,8#,10#0#,3#,8#,11#0#,1#,5#,8#,10#0#,1#,5#,8#,11#0#,1#,6#,10#0#,1#,6#,11#,7,每个都选择最早结束的序列-贪心策略0#-1#-5#-8#-10#这是最长序列,8,#includeconst int N=12;void OtputResult(int SelectN); cout“ 0”;for( int i=1; iN; i+ )if ( Select i =1) cout“,” i ;cout “ “ endl;,9,void main( ) int

3、BeginN=1,3,0,3,2,5,6,4,10,8,15,15;int EndN=3,4,7,8,9,10,12,14,15,18,19,20;int SelectN=0,0,0,0,0,0,0,0,0,0,0,0;int i=0;/当前最早结束的事件/当前可选事件的最早开始时间int TimeStart=0;,10,while( i =TimeStart ) Select i =1;TimeStart=End i ; i +;OutputResult ( Select ) ; ,11,Beging1 3 0 3 2 5 6 4 10 8 15 15 0 1 2 3 4 5 6 7 8 9

4、 10 11 End3 4 7 8 9 10 12 14 15 18 19 200 1 2 3 4 5 6 7 8 9 10 11Select1 1 0 0 0 1 0 0 1 0 1 00 1 2 3 4 5 6 7 8 9 10 11,12,区间覆盖问题0 1 2 3 4 5 6 7 8 9 10 11 1 3 4 8 11f1 8f2 8 f3 7 f4 6,13,删数问题 从 N 位数字串中删去 M 个数使剩下的数字串所表示的数值最小.,14,解题思路从一个例子开始分析:5 0 2 6 7 5 3 9 箭头表示0 2 6 7 5 3 9 值高 值低0 2 6 5 3 90 2 5 3

5、90 2 3 90 2 3 9 2 3 9,15,总结算法:1. 用键盘输入数字串S;2. 测 S 的串长 L;3. 输入要删除的数字个数 M;4. 当 ( M0 )时,做 i=1;当 ( i L 且 S i =S i +1 )i = i +1;删去 S i ; 5. 去掉 S 串中的高位 0.,16,#include void deleteS(char *p) while(*p)*p = *(p+1);p+; ,17,int main() char S240;int i,m;cout S;cout m; while( m= (int)strlen(S) );,18,while(m0)i =

6、0; while(SiSi+1) i+;deleteS( ,19,例子,2.第二步让B猜:B看到a=1,c=3,他会想到自己头上的数不是2就是4。B面对的猜测函数为:check(a,a+c,c,2)=check(1,4,3,2);check(a,|a-c|,c,2)=check(1,2,3,2);,20,例子,B还会想为什么A猜不到呢?B想:如果b2=2,A看到b=2,c=3,会想到自己头上的数是如果b2=4,A看到b=4,c=3,会想到自己头上的数是这两种情况A都不也猜。B认为A不也猜有道理,B自己也不敢猜。,21,例子,3.第三步让C猜:C看到a=1,b=2,他会想到自己头上的数不是1就是

7、3。C面对的猜测函数为:check(a,b,a+b,3)=check(1,2,3,3);check(a,b,|a-b|,3)=check(1,2,1,3);,22,例子,C会想为什么B猜不到呢?C想:如果c3=1,对B而言,B看到a=1,c3=1。B会很快判断出b=a+c3=1+1=2。可是B并未猜出,说明c3=1应被排除。两种可能性,一个被排除了,另一个就是所求了,即c3=3。我们用“与或”结点图来描述C的猜测过程。,23,例子,在上图中,CB1表示的是,C想:如果自己头上是3,B能不能猜出b=2。CB2表示的是,C想:如果自己头上是1,B能不能猜出b=2。,24,例子,C推测B对C头上的两

8、种可能数字的反映,来判定该排除哪一个,保留哪一个。如果能够保留一个排除一个则CB=true;如果两个都保留或两上都排除则CB=false。因此CB应为CB1与CB2的异或运算结果。上述这张图的物理意义是:要想判断check(1,2,3,3)是true还是false?要把它转化为 check(1,2,3,3) XOR check(1,2,1,2)check(1,2,3,3)是说让B猜,B如果看到c=1,a=1,他会抢先猜到自己头上的数是2。但这不是事实,因为B没敢猜。可见B看到的不是c=1,而是另一种可能c=3。故B帮助C排除了一种可能,成全了C,让C猜到c=3。,25,下面我们给出更为全面的与

9、或结点图。3人猜自己帽子上的数的“与或”结点图。定义:check(a,b,c,k)为猜数函数,为布尔型函数。其中a,b,c分别为A、B、C三人k为第k次猜。规定k=1为A猜,k=2为B猜,k=3为C猜。如猜测次数超过3,则有 k mod 3 = 1 为A猜, k mod 3 = 2 为B猜, k mod 3 = 0 为C猜。,26,27,AC1=check(b+c,b,c,k-1); AC2=check(abs(b-c),b,c,k-1); AC =AC1 XOR AC2; BA1=check(a,a+c,c,k-1); BA2=check(a,abs(a-c),c,k-1); BA =BA1 XOR BA2; CB1=check(a,b,a+b,k-1); CB2=check(a,b,abs(a-b),k-1); CB =CB1 XOR CB2;,28,说明: 1.结点F是函数check(a,b,c,k),意思是第k次猜出来了吗?如果函数值为true表示猜出了,false表示猜不出。 2.结点F是一个或结点,以k=0还是k0分支。当k=0时为直接可解结点E,函数值为false,可解释为还没让猜,当然为false。 3.当k0时,分支至D结点。D也是一个或结点,有三个分支:,29,结 束,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报