




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
过桥问题 一、课题内容与分析 题目:过桥问题描述:有N(N)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有个手电筒),每次最多两个人一起过桥(否则桥会垮)。N个人的过桥时间依次存入数组tN中,分别为:t0, t1, , tN-1。过桥的速度以慢的人为准!注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间。输入:有多组测试数据,每组数据先输入一个人数N,然后输入这N个人过桥所花的时间。输出:输出对应的最短时间。样例输入:4 1 2 5 104 5 2 10 1样例输出:1717 二、题目分析1、四个人的情况假设这四人分别为A、B、C、D。很明显,开始两人拿着手电筒过桥后,手电筒就在桥的另一边了,此时需要已经过桥的那两人中的一个再把手电筒送回桥这边。送手电筒回来过桥也要化时间,所以要选一个跑得比较快的。一个很自然的想法就是,每次让跑得最快的A陪着另一个过桥,然后A快速地跑回来,再陪下一位过去,最后所有人就都可以过桥了。让我们来算一下这要多长时间。为了方便起见,我们把旅行者出发的桥的这一边称为“此岸”,而把旅行者想要到达的那边叫“彼岸”。在表达一个过桥方案时,我们用“”来表示从彼岸到此岸的移动,用“”表示从此岸到彼岸的移动。前面“A护送大家过河”的方案就可以写成:(右边数字为完成此步骤所需时间)AB2 A1AC5 A1AD8一共就是2+1+5+1+8=17分钟。但其实有更快的办法:AB2 A1CD8 B2AB2一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥,这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。现在我们把这个问题推广到N(N4)个人过桥的情况:如果有N个旅行者,假设他们有各自所需的过桥时间(正实数)。在只有一只手电筒的情况下,要过上述的一条桥,怎样才能找到最快的过桥方案?假设最快地把N个旅行者从此岸移动到彼岸需要f分钟时间,那么我们把所有在f分钟时间内把N个旅行者从此岸移动到彼岸的方案称为“最佳方案”。最佳方案很有可能不止一个,我们的目的是要找到一个最佳方案,但是并不需要把所有的最佳方案全都找出来。2、一个合理的假设假设A为最快,B为次快,而Z是任意一个其他旅行者“由A护送最慢过桥,回来,然后继续护送最慢的过桥,再回来”,称作“模式一”。”两个最快的过桥(A和B过桥),A回来,两个最慢的过桥,B回来”,称作“模式二”。最佳方案构造法:以下是构造N个人(N1)过桥最佳方案的方法:1) 如果N=1、2,所有人直接过桥。2) 如果N=3,由最快的人往返一次把其他两人送过河。3) 如果N4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么当2b=a+y时,使用模式一将Z和Y移动过桥;当2ba+y时,使用模式二将Z和Y移动过桥;这样就使问题转变为N-2个者的情形,从而递归解决之。三、概要设计1.设计函数sort运用选择排序法从大到小排序。2.函数compare判断return (2*a1 - a0 - an-2) 0 ? 1 : 2;使用模式一返回1,使用模式二返回2。3.函数move计算结果,若n=2则直接为第二个人的用时; 第一趟移动:符合模式一 *count = *count + modelone(a0, an-1);符合模式二 *count = *count + a0 + 2*a1 + an-1;此时将问题转化为移动n-2个人移动,运用递归思想。4.main函数中while(scanf(%d, &n) != EOF)实现多组数据的输入。依次调用函数即可。四、详细设计#include/选择排序法void sort(int *a, int n) int i=0, j, temp, last; while(i i; j-) if(aj 0 ? 1 : 2;int print(int fast, int slow) return fast + slow;void move(int *a, int n, int *count) int com; if(n = 2) *count = *count + a1; else com = compare(a, n); switch(com) case 1: *count = *count + print(a0, an-1); n = n-1; move(a, n, count); break; case 2: *count = *count + a0 + 2*a1 + an-1; n = n-2; move(a, n, count); break; int main() int n;while(scanf(%d, &n) != EOF) int t100, i=0, com, count=0; for(i=0; i 0 ? 1 : 2;算法的思想核心。问题四、递归的思想难以把握,费事。问题五、int t100, i=0, com, count=0;必须出现在while(scanf(%d, &n) != EOF)里面,否则当输入多组数据时出现count为多个结果相加的情况,因为指针count是为了存储每次递归的结果的,所以必须定义在里面。七、 课程设计总结过桥问题的算法思想让我领悟到了算法的神奇,通过大量的计算与总结才能得出具有模式一模式二的形式,然后就是程序的编写,首先必须实现排序,再实现最慢次慢,最快次快临界条件的判断以及递归的计算。在写程序的过程中,每个功能的实现都需要写,思虑必须周全,选择排序法以及数组指针的使用都需要熟练地掌握,递归更是一个难点,相当于又学习了一遍。通过过桥问题从分析到解决使我的知识更加丰富了,比如while(scanf(%d, &n) != EOF) 可以输入多组数据。附加题2.学生成绩排名一、课题内容和要求期末考试时老师发飙出了1000道题目,每道题目1分。最终课程的及格分数由老师指定。现在班上的学生成绩已经批改好并按学号列出,要求你根据及格线将学生分为两个部分,分数低于及格线的同学要重修不参加排名,及格的同学从高到低排出名次。输入:三行数据,第一行为班级人数(小于1000),第二行按学号从低到高给出成绩,第三行给出及格分数线。输出:两行:第一行将同学的分数按是否及格输出,低于及格线的部分、大于等于及格线的部分内部先后顺序不变。第二行输出及格同学的成绩,从高到低排列。样例输入:6220 10 980 490 401 600490样例输出:220 10 401 980 490 600980 600 490二、题目分析应题目要求,数组的长度是小于1000的,要按题目说明的输出结果例如题中给的例子,6220 10 980 490 401 600490输出要求将大于490的置于后面并且顺序不变,然后就是排序后面的数并且输出此时就可定义数组然后排序输出即可。220 10 401 980 490 600980 600 490参考资料为c语言书三、概要设计1、sort函数的定义排序函数与过桥问题略有不同,用的是冒泡排序。2、main函数定义了两个数组asize与ssize,分别用于存储大于及格线与小于及格线的学生成绩。然后定义k是为了记录asize中的数的个数。四、详细设计#include#define size 1000int sort(int a,int n)int i,j,t;for(i=0;ii;j-)if(ajaj-1)t=aj-1;aj-1=aj;aj=t;int main()int asize,n,x,i,ssize,k;scanf(%d,&n);for(i=0;in;i+)scanf(%d,&ai);scanf(%d,&x);k=0;for(i=0;in;i+)if(aix)printf(%d,ai);printf( );for(i=0;i=x)sk=ai;printf(%d,ai);printf( );k+;printf(n);sort(s,k);for(i=0;ik;i+)printf(%d ,si);printf(n);return 0;五、测试数据及其结果分析样例输入:6220 10 980 490 401 600490样例输出:220 10 401 980 490 600980 600 490样例输入:8100 260 500 410 90 530 980 490400样例输出:100 260 90 500 410 530 980 490410 490 500 530 980已经试用多组数组均可得到理想的结果六、调试过程中的问题1、在写函数sort冒泡排序时,交换位置出现问题,编译没问题,但第二行输出结果出现问题一直都有数重复,而有的数没有在结果行出现。经过调试,发现排序时交换的问题,修改后可以得出正确答案。八、 课程设计总结在开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年甘肃省酒泉玉门市纪委招聘公益性岗位工作人员考前自测高频考点模拟试题及参考答案详解一套
- 2025湖南中南大学湘雅三医院国家妇产区域医疗中心(建设)生殖医学中心胚胎实验室技术员招聘1人考前自测高频考点模拟试题及答案详解(名师系列)
- 2025-2030工业气体现场制气模式经济性分析报告
- 安全法则培训课件
- 2025-2030工业无人机巡检作业效率与替代人工经济性分析报告
- 2025-2030工业大数据分析平台功能迭代与行业解决方案报告
- 单亲证明申请书
- 重新申请执业申请书范本
- 申请人()申请书
- 铁矿班长申请书
- 原发性血管炎肾损害护理
- 劳动者个人职业健康监护档案-模板
- 客运安全培训课件
- 药品进货查验管理制度
- 2025年福建省中考英语试卷真题(含标准答案)
- 骨科VTE管理制度
- 2025至2030年中国电力信息化产业发展态势及竞争格局预测报告
- 公司宣传物品管理制度
- GB/T 45653-2025新能源汽车售后服务规范
- 消防政治工作课件
- 松木桩地基处理施工方案
评论
0/150
提交评论