JAVA 游览时间最长

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


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

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

找到的最短路径如图:


先假设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分钟

针对第二问的最短路径:

点击打开链接

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

点击打开链接

猜你喜欢

转载自blog.csdn.net/abc1498880402/article/details/80213744
今日推荐