一、沙漠问题

1、问题描述

一辆吉普车来到1000km宽的沙漠边沿。吉普车的耗油量为1L/km,总装油量为500L。显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的。假设在沙漠边沿有充足的汽油可供使用,那么吉普车应在哪些地方、建多大的临的加油点,才能以最少的油耗穿过这块沙漠?

2、问题分析

从这个题目来看,这是一个极限问题,求得是最少耗油的量,所以只有唯一答案。

1、为了穿越这个沙漠,同时耗油量最少,那么吉普车就应该每次出发的时候都要满油量出发。

2、为了保证每一次都是满油量的从每个临时加油站出发,那么每一个临时加油站的油量储备都应该是500L的倍数。

3、为了保证耗油量最少,每一次建立一个临时加油站的时候,运输的次数也是越少越好,减少重复的路段。

4、如果这道题通过递推法正推的话很难确定第一个临时加油站的地点。

5、所以这里我们用倒推法来做。

6、假设我们已经到达了B点,这个时候B点的储油量应该0,这是可以倒推C1点的储油量应该为500L,这时候可以刚好到达终点B。好了现在我们知道C1点的储油量了,也就知道了C1到B点的距离为500米。

7、这时候我们应该想,如果向C1点运输500L的油量,C2点应该存储多少油呢?根据上面的步骤2(临时加油站的油量储备都应该是500L的倍数)和步骤3(运输的次数也是越少越好,这里肯定是两次或者两次以上才能向C1点运输500L油,这里取2次),那么我们就知道了C2点的储油量应该是500L*2,也就是1000L油。这时,C2到C1的距离为500/3。

8、如果想C2点运输1000L的油,重复步骤7可知,C3点存储油量为500×3L,C3到C2的距离为500/5。

9、所以到达临时加油站Cn的时候,储油量应该是500×n,Cn到Cn-1的距离为500/2n-1。
所以这里通过下面这个式子算出n:
500+500/3+500/5+500/(2n-1) = 1000;
然后就可以得出最少耗油量。

3.实现

public class Desert {public double totaldistance;//总长度public double speed;//单位距离的油耗速度public double oilper;//单次的最大负载public void result(double total,double speed,double oilper) {this.oilper=oilper;this.speed=speed;this.totaldistance=total;//假设都是满载行驶double distance = oilper/speed;//每段路的距离if(totaldistance <= distance) {System.out.println("总距离小于第一段距离,可以一次通过。");}//需要设置补给站点,每个站点的存储量为单次的最大负载的整数倍double dis=distance;int i=0;//站点个数while(dis < totaldistance) {//每一个站点的距离之和,即计算设置多少个站点才能通过totaldistance总长i++;dis+=1.0/(2*i+1)*distance;}int num=i;double totalOil = 0;while(i>0) {dis-=distance/(2*i+1);i--;if(totalOil==0) {totalOil=oilper*i+(totaldistance-dis)*(2*i+1)/speed;}System.out.println("第"+(num-i)+"个站点为距离起点"+(totaldistance-dis)+"处,存储量为"+oilper*i+"L");}System.out.println("总耗油量为"+totalOil+"L");} public static void main(String[] args) {double total=1000.0;double speed=1.0;double oilper=500.0;Desert desert=new Desert();desert.result(total,speed,oilper);}}

4.结果

第1个站点为距离起点22.433122433122435处,存储量为3000.0L
第2个站点为距离起点60.89466089466089处,存储量为2500.0L
第3个站点为距离起点106.34920634920638处,存储量为2000.0L
第4个站点为距离起点161.90476190476193处,存储量为1500.0L
第5个站点为距离起点233.33333333333337处,存储量为1000.0L
第6个站点为距离起点333.33333333333337处,存储量为500.0L
第7个站点为距离起点500.0处,存储量为0.0L
总耗油量为3291.630591630592L

二、狱吏问题

1、问题描述

某王国对囚犯进行大赦,让一狱吏n次通过一排锁着的n间牢房,每通过一次按所定规则转动门锁,每转动一次,原来锁着的被打开,原来打开的被锁上;通过n次后,门锁开着的,牢房中的犯人放出,否则犯人不得获释.转动门锁的规则是这样的,第一次通过牢房,要转动每一把门锁,即把全部锁打开;第二次通过牢房时,从第二间开始转动,每隔一间转动一次;第k次通过牢房,从第k间开始转动,每隔k-1 间转动一次;问通过n次后,哪些牢房的锁仍然是打开的?

2、问题分析

牢房可以视作一个一元数组,1代表锁着,0代表开锁。
规律:当锁的标号为一个数的平方时,那么最后它会开着。

3.实现

public class Warder {public void WarderResult(int n) {//1表示锁着,0表示开锁System.out.println("暴力法");int room[] = new int[n];int i;for (i=0;i<n;i++) {//初始状态都是锁着room[i]=1;}System.out.println("牢房数为"+n+"时");int k,j;for(i=1;i<=n;i++) {//i表示通过牢房次数System.out.print("第"+i+"次通过牢房");for(k=i;k<=n;k+=i) {if(room[k-1]==1) {room[k-1]=0;}else {room[k-1]=1;}}for(j=0;j<n;j++) {if(room[j]==0) {System.out.print(j+1+"、");}    }System.out.println("是开锁的");}}public void LawWarder(int n) {System.out.println("规律法");System.out.println("牢房数为"+n+"时");for(int i=1;i<+n;i++){if(i*i<=n) {System.out.print(i*i+"、");}}System.out.println("是开锁的");}public static void main(String[] args) {int n=10;//牢房间数Warder warder= new Warder();warder.WarderResult(n);warder.LawWarder(n);}
}

4.结果

暴力法
牢房数为10时
第1次通过牢房1、2、3、4、5、6、7、8、9、10、是开锁的
第2次通过牢房1、3、5、7、9、是开锁的
第3次通过牢房1、5、6、7、是开锁的
第4次通过牢房1、4、5、6、7、8、是开锁的
第5次通过牢房1、4、6、7、8、10、是开锁的
第6次通过牢房1、4、7、8、10、是开锁的
第7次通过牢房1、4、8、10、是开锁的
第8次通过牢房1、4、10、是开锁的
第9次通过牢房1、4、9、10、是开锁的
第10次通过牢房1、4、9、是开锁的
规律法
牢房数为10时
1、4、9、是开锁的

算法之穿越沙漠、狱吏问题相关推荐

  1. 2020全国大学生数学建模竞赛穿越沙漠第二问求解方法

    第二问的模型相比第一问的区别就是天气未知,在天气未知的情况下,决定行动策略.因为天气未知,所以最优的决策不一定能得到最好的结果,因此就需要在第二问未知的条件下设计决策说明自己方法的优越性,一次穿越的结 ...

  2. 算法设计与分析-迭代法-穿越沙漠问题

    算法设计与分析-迭代法-穿越沙漠问题 题目: 用一辆吉普车穿越1000公里的沙漠.吉普车的总装油量为500升,耗油率为1升/公里.由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库.该吉普车以最少 ...

  3. 【算法设计zxd】第3章 迭代法 杨辉三角,穿越沙漠,内存移动,竖式相乘(阶乘)

    目录 迭代:(辗转法)        一种 不断用变量的旧值递推新值的过程 [例3-1] 输出如图的杨辉三角形. [例3-2]穿越沙漠问题 [例3-2]内存移动问题 [例3-4]编程求当n<=1 ...

  4. 算法 穿越沙漠问题(递推法)

    问题描述 一辆吉普车来到1000km宽的沙漠边沿.吉普车的耗油量为1L/km,总装油量为500L.显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的.假设在沙漠边沿有充足的 ...

  5. 汽车穿越沙漠的算法问题【python】

    一辆吉普车来到1000km宽的沙漠边沿.吉普车的耗油量为1L/km,总装油量为500L.显然,吉普车必须用自身油箱中的油在沙漠中设几个临时 加油点,否则是通不过沙漠的.假设在沙漠边沿有充足的汽油可供使 ...

  6. 2020数学建模国赛B题穿越沙漠个人解析

    前言 博主发这篇文章的时候国赛早就结束了,仅仅是出于给自己留个纪念以及交流讨论的目的写的博客.所以如果你对我不在比赛那几天发的行为感到不满,请直接退出就好,我也没觉得自己的想法多么优秀,能够断言自己是 ...

  7. 2020年数学建模国赛B题“穿越沙漠”思路

    目录 原题 关键词 目标 问题一分析 问题二分析 问题三分析 比赛后的一些些感想 原题 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在 ...

  8. 基于静态博弈的穿越沙漠游戏最优策略

    全国大学生数学建模大赛B题简析 基于静态博弈的穿越沙漠游戏最优策略 摘要 一.问题重述 二.问题分析 第一问的分析 第二问的分析 第三问的分析 部分代码 基于静态博弈的穿越沙漠游戏最优策略 摘要 穿越 ...

  9. 2020数学建模国赛(B)穿越沙漠

    2020年高教社杯全国大学生数学建模竞赛题目 (请先阅读"全国大学生数学建模竞赛论文格式规范") B题 穿越沙漠 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和 ...

最新文章

  1. pyqt5 视频播放器
  2. 脚本化 tmux — LinuxTOY
  3. SAP MM 采购申请评估价格不能为0?
  4. Ubuntu16.04 -- 后台进程Nohup
  5. python 库整理: collections.namedtuple
  6. java方法6_6. java 方法
  7. 【Python】异常捕获
  8. 基于Jquery的图片自动分组且自适应页面的缩略图展示特效
  9. 猴子吃桃问题java思路_java编程题猴子吃桃问题答案
  10. 楼宇报警器 java程序_智能楼宇防盗报警系统
  11. 综述 | 一文读懂自然语言处理NLP(附学习资料)
  12. 普歌-Vue 封装防刷新考试倒计时组
  13. 3蛋白wb_有这3个工具!蛋白实验不愁!
  14. 东北大学秦皇岛分校计算机类排名,东北大学秦皇岛分校全国排名,2021东北大学秦皇岛分校排名榜...
  15. git 避免提交_新秀Git错误避免
  16. 解决FTP上传时报错“父路径不存在”问题
  17. java表盘时钟的设计思路_java代码实现时钟
  18. 开源BBS论坛软件推荐
  19. Mysql日期的加减法_mysql日期加减
  20. 下载单词英语单词_单词如何塑造体验

热门文章

  1. HTML 禁止网页复制文字图片,右键保存图片,拖拽图片
  2. AES加密解密(CBC模式)
  3. Windows idea 搜狗输入法输入中文只显示英文
  4. 【麦当劳 肯德基】是美国在中国的基因武器试验场(转)
  5. HeyUI新版首页设计之路
  6. 良仓孵化器一周年了,汇报一下
  7. 百度开源的分布式 ID 生成器,太强大了!
  8. 搞一下SOA | 01 SOA详解及行业现状
  9. 学习笔记-----制作图片分类标签
  10. 廉价迷你 Linux 机器 Raspberry Pi 详解