Java 什么';这背后的算法是什么?

Java 什么';这背后的算法是什么?,java,algorithm,Java,Algorithm,我做了这个练习,但不知道它背后的算法: 默认情况下,您的汽车以n(表示每秒n米)的速度行驶。你走回家的最短路线(你已经知道了),但是经过一些交通灯。每个交通灯T都有一个周期p,这意味着交通灯在每p秒后打开。(例如,如果周期为3,则在时间3、6、9、12等处指示灯为绿色,在时间1、2、4、5、7、8等处指示灯为红色)所有交通灯之间还有一段距离,用d表示 例如:汽车持续以每秒1米的速度行驶。第一个红绿灯距离为5。它的周期是3。这意味着你在时间=5到达那里,必须等待1秒,灯才会变绿。您将在时间=6时返

我做了这个练习,但不知道它背后的算法:

默认情况下,您的汽车以n(表示每秒n米)的速度行驶。你走回家的最短路线(你已经知道了),但是经过一些交通灯。每个交通灯T都有一个周期p,这意味着交通灯在每p秒后打开。(例如,如果周期为3,则在时间3、6、9、12等处指示灯为绿色,在时间1、2、4、5、7、8等处指示灯为红色)所有交通灯之间还有一段距离,用d表示

例如:汽车持续以每秒1米的速度行驶。第一个红绿灯距离为5。它的周期是3。这意味着你在时间=5到达那里,必须等待1秒,灯才会变绿。您将在时间=6时返回行程

现在还有一件事:你也可以用你的涡轮速度m(这将永远大于或等于n),但只有x倍。涡轮增压器将保持两个交通灯之间的整个距离。因此,在本例中,它将保持在5或20,并导致持续时间为2.5或10秒

你必须在最短的时间内返回你的住所。输入将为:
交通灯数量|您可以使用涡轮增压器的次数(x)|正常速度(n)|涡轮增压器速度(m)
到交通灯1的距离(Td)|交通灯1的周期(Tp)
到交通灯2的距离(Td)|交通灯2的周期(Tp)
等等

例如:
2.1.2
5.3
20 2

最短的时间是16分钟。(时间从车辆出发时开始,到车辆结束时结束。)

这背后的算法是什么?您是否必须在每次可能的跑步时间进行检查

我希望你能帮助我

编辑 我有一种计算时间的方法,不需要使用turbo:
对于每个交通灯,我创建一对(int-length,int-period)。默认情况下,时间设置为0。交通信号灯之间的计算结果为:

int i = 0;
int time = 0;
while(i<S.size()-1) {
   Pair current = S.get(i);
   time = time + Math.ceil(current.getLength() / n);
   time = current.getPeriod * ceil(time / current.getPeriod());
   i++;
}
return time;
inti=0;
整数时间=0;

虽然(i一个历元可以用剩余的次数来表示,您可以使用turbo x_t,剩余的距离d_t和t.t乘以所有周期的ppcm也可以,但我认为您不会得到太大的改进

在此基础上,您可以使用A*算法()进行以下启发式操作:

h(d_t, x_t, t) = 
    if (m*x_t <= d_t)
        ceil(d_t/m)
    else 
        ceil((d_t-(x_t*m)) / n)
h(d\t,x\t,t)=
如果(m*x_t那么这里有一个“愚蠢的、递归的蛮力”(如评论中所提到的,但是,一个优化会切断次优分支)用JavaScript解决问题(虽然原始标记是Java,但允许运行代码),而不是“到红绿灯的距离”为了简化输入处理,我简单地放置了每个灯光的绝对位置。此外,在时间0开始所有灯光循环并不像每个灯光在指定时刻开始并且具有不等的活动/不活动间隔那样有趣(类似灯光#1从1秒开始,保持激活状态3秒,然后熄灭5秒,然后重复3+5循环)

“严格使用”;
班灯{
构造函数(在,间隔){
this.at=at;
这个周期=间隔;
}
isRed(时间){
返回数学下限(时间/本时段)%2!==0;
}
};
班车{
构造函数(提升,位置=0,速度=0,时间=0,上一个=null){
这个位置=位置;
速度=速度;
this.boosts=boosts;
这个时间=时间;
this.prev=prev;
}
访问(职位){
返回位置>=this.position&&position 0&&this.speedx[0].tolocalString('en-US',{minimumIntegerDigits:2}))+
“\npos:”+trace.map(x=>x[1].tolocalString('en-US',{minimumIntegerDigits:2}))+
“\n种子:“+trace.map(x=>x[2].tolocalString('en-US',{minimumIntegerDigits:2}));
}
归还这个;
}
};
常数问题={
涡轮转速:2,
正常速度:1,
促进:1,
灯光:[
新光(5,3),
新光(25,2)
],
FindReadlight:功能(汽车){
把这个还给我
.filter(x=>x.isRed(car.time)和car.visions(x.at))[0];
},
距离:0,
最佳时间:Number.MAX\u SAFE\u整数,
findBestTime:功能(汽车){
如果(car.time>this.bestTime)
返回Number.MAX\u SAFE\u整数;
const distance left=此.distance-car.position;
if(distance left this.findBestTime(args))
.reduce((a,b)=>Math.min(a,b));
this.bestTime=Math.min(this.bestTime,shortestTime);
返回时间最短;
}
};
problem.distance=problem.lights
.map(x=>x.at)
.reduce((x,y)=>Math.max(x,y));
const t=problem.findbestime(新车(problem.boosts));

console.log(“最佳时间:+t)
那么…你试过什么…?这是作业,至少试着写一些代码,然后回来征求意见。@yegodm是的,当汽车从一开始就启动时,它们就启动了。所以在上面的例子中,汽车从0开始。距离是5,所以它在时间=5时到达交通灯。交通灯也有时间=5,但周期是3因此,在3时变绿。汽车在时间=6时继续行驶。然后它必须在距离为20的下一个红绿灯处行驶,因此它在时间=26时到达。对于那个红绿灯,时间也是6。周期是2,所以它已经变绿了。(这个例子没有使用涡轮增压器)@yegodm哦,确实忘了提到这一点。tu