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分钟
针对第二问的最短路径:
第一问的最短路径看我上一篇博客
上一篇: 邻接矩阵存储图的深度优先遍历
下一篇: OpenFeign服务接口调用