蜗牛——蓝桥杯

蜗牛

题目分析

第一个阶段定义dp数组

(1)缩小规模。我们要从第1根竹竿爬到第n根竹竿,那么规模就是这n根竹竿,dpi表示当前爬到了第i根竹竿。

(2)考虑限制。

限制1,只能在x轴或者竹竿上爬行,在x轴上爬行速度为1单位每秒,在竹竿上向上和向下爬行的速度分别为0.7单位每秒和1.3单位每秒。

限制2,在第i和第i+1个竹竿间有传送门,可以由第i根竹竿高度为 a i a_i ai的位置 ( x i , a i ) (x_i,a_i) (xi,ai),瞬移到第i+1根竹竿高度为 b i + 1 b_{i+1} bi+1的位置 ( x i + 1 , b i + 1 ) (x_{i+1},b_{i+1}) (xi+1,bi+1)。

对于一个蜗牛的在第i根竹竿上的位置有两种状态,要么是从x轴爬过来的,此时高度为0,要么是从第i-1个竹竿瞬移过来的,此时高度为 b i b_i bi。需要一个状态表示此时蜗牛处在哪个位置,所以 d p i 0 dpi0 dpi0表示从x轴爬过来的,此时高度为0, d p i 1 dpi1 dpi1表示从第i-1个竹竿瞬移过来的,此时高度为 b i b_i bi。

(3)定义dp数组

d p i 0 dpi0 dpi0表示从x轴爬过来的,此时高度为0,花费的时间。

d p i 1 dpi1 dpi1表示从第i-1个竹竿瞬移过来的,此时高度为 b i b_i bi,花费的时间。

第二个阶段推导状态转移方程

d p i 0 = m i n ( d p i − 1 0 + x i − x i − 1 , d p i − 1 1 + b i / 1.3 ) dpi0=min(dpi-10+xi-xi-1,dpi-11+bi/1.3) dpi0=min(dpi−10+xi−xi−1,dpi−11+bi/1.3)

d p i − 1 0 + x i − x i − 1 dpi-10+xi-xi-1 dpi−10+xi−xi−1表示是从第i-1个竹竿从x轴爬过来的,那么消耗的时间就是x轴上的距离 x i − x i − 1 xi-xi-1 xi−xi−1。

d p i − 1 1 + b i / 1.3 dpi-11+bi/1.3 dpi−11+bi/1.3表示是从第i-1个竹竿从x轴瞬移过来的,瞬移到高度为bi的地方,那么我要从那个地方下来,那么消耗的时间就是从y轴下来的距离 b i / 1.3 bi/1.3 bi/1.3。

i f ( a i > b i ) if(ai>bi) if(ai>bi),如果是瞬移过来的,我要向上爬。

d p i 1 = m i n ( d p i 0 + a i / 0.7 , d p i − 1 1 + ( a i − b i ) / 0.7 ) dpi1=min(dpi0+ai/0.7,dpi-11+(ai-bi)/0.7) dpi1=min(dpi0+ai/0.7,dpi−11+(ai−bi)/0.7)

i f ( a i < b i ) if(ai<bi) if(ai<bi),如果是瞬移过来的,我要向下爬。

d p i 1 = m i n ( d p i 0 + a i / 0.7 , d p i − 1 1 + ( b i − a i ) / 1.3 ) dpi1=min(dpi0+ai/0.7,dpi-11+(bi-ai)/1.3) dpi1=min(dpi0+ai/0.7,dpi−11+(bi−ai)/1.3)

第三个阶段写代码

(1)dp数组的初始化

从(0,0)处开始爬,爬到第一个竹竿和第一个竹竿传送门处的耗时如下。

java 复制代码
double[][] dp = new double[n + 1][2];
dp[1][0] = x[1]; // 底端最小用时
dp[1][1] = x[1] + a[1] / 0.7; // 传送门用时

(2)递推dp数组

a.第一层for循环表示的是规模

c.第二层for循环表示的是dp数组的转移点 只有两个,不需要用for循环

(3)表示答案

d p n 0 dpn0 dpn0

题目代码

java 复制代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] x = new int[n+1];
        int[] a = new int[n+1];
        int[] b = new int[n+1];
        for(int i = 1;i<=n;i++){
            x[i] = sc.nextInt();
        }
        for(int i = 1;i<n;i++){
            a[i] = sc.nextInt();
            b[i+1] = sc.nextInt();
        }
        double[][] dp = new double[n+1][2];
        dp[1][0] = x[1];
        dp[1][1] = x[1] + a[1]/0.7;
        for(int i = 2;i <= n;i++){
             dp[i][0] = Math.min(dp[i-1][1] +b[i]/1.3 ,dp[i-1][0]+x[i]-x[i-1]);
            if(a[i]>b[i]){
                dp[i][1] = Math.min(dp[i][0] + a[i]/0.7, dp[i-1][1] + (a[i]-b[i])/0.7);
            }else {
                dp[i][1] = Math.min(dp[i][0] + a[i]/0.7,dp[i-1][1] + (b[i]-a[i]) /1.3);
            }          
        }
        System.out.printf("%.2f",dp[n][0]);
        sc.close();
    }
}
相关推荐
Wang's Blog6 小时前
Java 项目实战:交友项目环信云通信全解——体系集成、执行链路与 REST API 实战
java·spring·交友
god_cvz6 小时前
第三章:12、经验沉淀与自优化
java·ai
怕浪猫6 小时前
不用摄像机,我把历史故事做成竖屏视频
算法·面试·github
小冯不疯6 小时前
查询旺店通货品策略实战教程:从源系统拉取到轻易云的端到端落地
java·大数据·数据库
SunnyDays10116 小时前
Java 实现 Excel 与 Markdown 相互转换:表格导出、格式设置与多表提取
java·excel转markdown·markdown转excel
zjx23886 小时前
java很老的web工程重构,加入详细异常链信息分析
java·重构
山东孙燕姿6 小时前
设备台账重构:从一张表到三层模型
android·java·网络·低代码·重构·rxjava
萧瑟余晖6 小时前
Spring缓存抽象详解
java·spring·缓存
郝学胜-神的一滴6 小时前
AI 编程智能体 16:从零基础搭建到精细化优化
人工智能·python·算法·语言模型·langchain·pip
贾伟康7 小时前
【共创稿事节】一个 UserDataManager 管八类数据:Preferences 持久化的克制用法
java·服务器·前端·harmonyos·arkts·鸿蒙