蓝桥杯题目

蓝桥杯竞赛题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);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值