蓝桥杯竞赛题java
这天,一只蜗牛来到了二维坐标系的原点。
在x轴上长有根竹竿。它们平行于y轴,底部纵坐标为0,横坐标分别
为x1,x2,x。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第
n个竹竿的底部也就是坐标(x,0)。它只能在x轴上或者竹竿上爬行,在x轴
上爬行速度为1单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行
的速度分别为0.7单位每秒和1.3单位每秒。
为了快速到达目的地,它施展了魔法,在第i和i+1根竹竿之间建立了传
送门(0<i<n),如果蜗牛位于第i根竹竿的高度为a;的位置(x,a),就可以
瞬间到达第i+1根竹竿的高度为b+1的位置(x+1,b+1),请计算蜗牛最少需要
多少秒才能到达目的地。
【输入格式】
输入共1+n行,第一行为一个正整数n;
第二行为n个正整数x1,x2,.,xn;
后面n-1行,每行两个正整数a,b+1。
【输出格式】
输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。
【样例输入】
3
110
11
11
21
【样例输出】
4.20
【样例说明】
蜗牛路线:
(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0),花费时间为1+1/0.7+
0+1/1.3+1≈4.20
思路:采用递归思想,时间等于前面到倒数第二个杆子的时间加上倒数第二个杆子到倒数第一个杆子的时间,依次类推
public class test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
ArrayList<int[]> list = new ArrayList<>();
for(int i = 0;i<n-1;i++){
int[] arr1 = {sc.nextInt(),sc.nextInt()};
list.add(arr1);
}
System.out.println(Math.round(doem(n,0,arr,list)*100)/100.0);
}
public static double doem(int num,int flag,int[] arr,ArrayList<int[]> list){
int n=num-1;
if(n==1){
if(flag==0){
//在地上
double t1 = arr[n];
double t2 = arr[n-1]+list.get(n-1)[0]/0.7+list.get(n-1)[1]/1.3;
return Math.min(t1,t2);
}else{
double t1 = arr[n]+list.get(n-1)[1]/0.7;
double t2 = arr[n-1]+list.get(n-1)[0]/0.7;
return Math.min(t1,t2);
}
}
int b = list.get(n-2)[1];
int a = list.get(n-1)[0];
if(flag==0){
//在地上
double t1 = arr[n]-arr[n-1];
if(b>a){
//向下爬
double t2 = (b-a)/1.3+list.get(n-1)[1]/1.3;
return Math.min(doem(num-1,1,arr,list)+t2,doem(num-1,0,arr,list)+t1);
}else{
//向上爬
double t3 = (a-b)/0.7+list.get(n-1)[1]/1.3;
return Math.min(doem(num-1,1,arr,list)+t3,doem(num-1,0,arr,list)+t1);
}
}else{
//在上面
double t1 = arr[n]-arr[n-1]+list.get(n-1)[0]/0.7;
if(b>a){
//向下爬
double t2 = (b-a)/1.3;
return Math.min(doem(num-1,0,arr,list)+t1,doem(num-1,1,arr,list)+t2);
}else{
double t2 = (a-b)/0.7;
return Math.min(doem(num-1,0,arr,list)+t1,doem(num-1,1,arr,list)+t2);
}
}
}
}