欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA 游览时间最长

程序员文章站 2022-06-13 11:46:13
...

如果某游客12:00从景石出发,要求他17:00前到达湿地商业街,17:30离开湿地商业街(注:根据表2的要求在湿地商业街游览时间至少为30分钟)。建立数学模型,为该游客设计一条能游览完全部景点(景点①—⑦)且游览总时间最长的游览路线(假设在各个景点没有等待时间)。

JAVA 游览时间最长

因为出发时间为12:00,到湿地商业街的时间为17:00,所以总的时间为T=5:00。总的时间T=步行时间W+游览时间V,即T=W+V。T是固定的,要想增大V,就得减少W。

0~7 分别表示景石、游客服务中心、阳光草坪、森林小剧场、儿童科普体验区、儿童戏水场、湿地博物馆、湿地商业街

找到的最短路径如图:

JAVA 游览时间最长

先假设2的游览时间num2=50min,4的游览时间num4=50min,3的游览时间num3=30min,5的游览时间num5=50min,1的游览时间num1=10min,6的游览时间num6=60min,现在时间now=12:00。

(1)先用now记录从0到3的时间,如果到达3的时间不是整点或半点,则减少上一个景点4的游览时间,直到到达3的时间为整点或半点。如果减少4的游览时间到了最少时间30min还不能让到达3的时间为整点或半点,则再减少上一个景点2的游览时间,直到到达3的时间为整点或半点(因为减少的时间最多为29min,所以减少两个景点的时间足以让到达3的时间为整点或半点)。否则直接进入(2)。

(2)用now来记录0到1的时间,如果到达1的时间大于15:50(因为1的游览时间最少为10min),则减少5的游览时间,直到到达1的时间小于或等于15:50。否则直接进入(3)

(3)用now来记录0到7的时间,如果到达7的时间大于17:00,则减少6的游览时间,直到到达7的时间等于17:00。(因为总时间为5h,所以最后的时间一定是大于17:00)


public class LinkList {

	public static void main(String[] args) {
		class Time{
	
			int timeadd(int time1,int time2)   //时间加法函数
			{
				int time,minute;
				minute=time1%100+time2%100;
				if(minute>=60)
					time=time1+time2+100-60;
				else
					time=time1+time2;
				return time;
			}
			int timesub(int time1,int time2)   //时间减法函数
			{
				int time;
				int minute1=time1%100;
				int minute2=time2%100;
				if(minute1<minute2)
					time=time1-time2-100+60;
				else
					time=time1-time2;
				return time;
			}
		}
		
			int i;
			int [] a=new int[7];                         //分别记录经过每条路径的时间
			a[0]=(int)(360.0*60/2000+0.5);	  //0->2的路时
			a[1]=(int)(230.0*60/2000+0.5);	  //2->4的路时
			a[2]=(int)(470.0*60/2000+0.5);	  //4->3的路时
			a[3]=(int)(265.0*60/2000+0.5);    //3->5的路时
			a[4]=(int)(285.0*60/2000+0.5);    //5->1的路时
		        a[5]=(int)(200.0*60/2000+0.5);    //1->6的路时
			a[6]=(int)(190.0*60/2000+0.5);	  //6->7的路时
							                 
			System.out.println("0->2的路时:"+a[0]);   //输出路时
			System.out.println("2->4的路时:"+a[1]);
			System.out.println("4->3的路时:"+a[2]);
			System.out.println("3->5的路时:"+a[3]);
			System.out.println("5->1的路时:"+a[4]);
			System.out.println("1->6的路时:"+a[5]);
			System.out.println("6->7的路时:"+a[6]);
			int num2=50,num4=50,num3=30,num5=50;  
			int num1=30,num6=60;
			int now=1200;  //现在时间
			Time time=new Time();
			now=time.timeadd(now,a[0]);   //0->2的路时
			now=time.timeadd(now,num2);   //2的游览时间
			now=time.timeadd(now,a[1]);   //2->4的路时
			now=time.timeadd(now,num4);   //4的游览时间
			now=time.timeadd(now,a[2]);   //4->3的路时
			while( now%100!=0 && now%100!=30 )    // 当走到3的时间不是整点或半点时或减少的时间小于等于30分钟
			{                                     // 则减少前一个景点的游览时间
					now=time.timesub(now,1);           // 凑够整点或半点
					num4--;
			}                                                                   
			now=time.timeadd(now,num3);   //3的游览时间       总路径:          
			now=time.timeadd(now,a[3]);   //3->5的路时        0->2->4->3->5->1->6->7               
			now=time.timeadd(now,num5);   //5的游览时间            
			now=time.timeadd(now,a[4]);   //5->1的路时                 
			now=time.timeadd(now,num1);     //1的游览时间
			while(now>1600)              //当在1游览30分钟后的时间大于16:00
			{                            //则减少前一个景点的游览时间
				now=time.timesub(now,1);      //直到小于或等于16:00
				num1--;
			}
			now=time.timeadd(now,a[5]);   //1->6的路时
			now=time.timeadd(now,num6);   //6的游览时间
			now=time.timeadd(now,a[6]);   //6->7的路时
			while(now>1700)               //当到达7的时间大于17:00
			{                             //则减少前一个景点的游览时间
				now=time.timesub(now,1);       //直到小于或等于17:00
				num6--;
			}
			System.out.print("\n");
			System.out.println("2的游览时间:"+num2);  //输出游览时间
			System.out.println("4的游览时间:"+num4);
			System.out.println("3的游览时间:"+num3);
			System.out.println("5的游览时间:"+num5);
			System.out.println("1的游览时间:"+num1);
			System.out.println("6的游览时间:"+num6);
	   }
	}

总游览时间:269分钟

总步行时间:61分钟

针对第二问的最短路径:

点击打开链接

第一问的最短路径看我上一篇博客

点击打开链接