第十四届蓝桥杯蜗牛

蜗牛 线性dp

目录

蜗牛 线性dp

先求到达竹竿底部的状态转移方程

求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑


题目链接:蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网

关键在于建立数组将竹竿上的每个状态量表示出来,并分析出状态转移方程

  
       int tree []  = new int[n];//记录每根竹竿到原点的距离
         int portal_exit [] = new int[n];//第i个竹竿上传送门出口高度
         int portal_entrance [] = new int[n];//第i个竹竿上传送门入口的高度
         double time_bottom [] = new double[n];//到达第i个竹竿底部的最短时间
         double time_portal [] = new double[n];//到达第i个竹竿传送门入口的最短时间

注意:到达第i个竹竿传送门入口的最短时间也是,蜗牛传送到第i+1根竹竿传送门出口的最短时间

很明显,代码中表示最状态的数组为 time_bottom[i]表示蜗牛从原点到达第i根竹竿的底部用的最短时间

time_portal[i] 表示蜗牛从原点到达第i根竹竿可以传送到第i+1竹竿的传送门入口 a1的最短1时间

我们需要求出time_bottom[i]和time_poratal[i]的状态转移方程

先求到达竹竿底部的状态转移方程

由图可知

到达第i竹竿底部的方法有两种

(1)从前一个竹竿的底部直接爬过来

time_bottom[i]=time_bottom[i-1]+tree[i]-tree[i-1];

ps:tree[i]-tree[i-1]为蜗牛从前一个竹竿爬过来用的时间

(2)从当前竹竿的传送门出口爬下来

到达第i根竹竿底部的时间=蜗牛到达第i根竹竿的传送门出口的时间(即到达第i-1竹竿传送门入口的时间:time_portal[i-1])+ 传送门出口到底部距离/下爬速度

time_bottom[i]=time_portal[i-1]+portal_exit[i]/1.3;

综合(1)(2)得time_bottom[i]得状态转移方程

 time_bottom[i]=Math.min(time_bottom[i-1]+tree[i]-tree[i-1],time_portal[i-1]+portal_exit[i]/1.3)
求蜗牛到达第i根竹竿的传送门入口的最短时间

同样有两种方式

(1)从传送门出口爬到传送门入口

如果传送门出口比传送门入口高那么直接向下爬

到达传送门出口的时间+传送门出口-传送门入口的距离/速度

 time_portal[i]=time_protal[i-1]+(portal_exit[i]-portal_entrance[i])/1.3;

如果传送门出口的高度比入口的低那么就要向上1爬速度为0.7

(2)从底部爬到传送门

 time_portal[i]=time_bottom[i]+portal_entrance[i]/0.7;

综上time_portal[i]的状态转移方程为:(传送门出口比传送门入口高的情况)

 ime_portal[i]=Math.min(time_protal[i-1]+(portal_exit[i]-portal_entrance[i])/1.3,time_bottom[i]+portal_entrance[i]/0.7)

最后我们可以给第1根竹竿的状态初始化

 //第一根竹竿的底部和传送出口最短时间我们可以算出来
       
  time_bottom[0]=tree[0];//1
         time_portal[0]=tree[0]+portal_entrance[0】;

第n根竹竿我们要特殊判断一下因为最后一根竹竿没有传送门入口

完整代码

import java.util.Scanner;

public class Snail {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int tree []  = new int[n];//记录每根竹竿到原点的距离
        int portal_exit [] = new int[n];//第i个竹竿上传送门出口高度
        int portal_entrance [] = new int[n];//第i个竹竿上传送门入口的高度
        double time_bottom [] = new double[n];//到达第i个竹竿底部的最短时间
        double time_portal [] = new double[n];//到达第i个竹竿传送门入口的最短时间
        for (int i=0;i<n;i++){
        tree[i]=sc.nextInt();
    }
        for (int i=0;i<n-1;i++){
            portal_entrance[i]=sc.nextInt();
            portal_exit[i+1]=sc.nextInt();
        }
//第一根竹竿的底部和传送出口最短时间我们可以算出来
        time_bottom[0]=tree[0];//1
        time_portal[0]=tree[0]+portal_entrance[0]/0.7;//2.4
        for (int i=1;i<n;i++){
//            给出结束条件
            if (i==n-1){
//            从上一根竹竿底部直接到第i根竹竿底部
                double bottom1 = time_bottom[i-1]+tree[i]-tree[i-1];
//                从第i根竹竿的传送门出口向下爬到底部
                double bottom2 = time_portal[i-1]+portal_exit[i]/1.3;
                time_bottom[i]=Math.min(bottom1,bottom2);
                break;
            }else{
                //            从上一根竹竿底部直接到第i根竹竿底部
                double bottom1 = time_bottom[i-1]+tree[i]-tree[i-1];
//                从第i根竹竿的传送门出口向下爬到底部
                double bottom2 = time_portal[i-1]+portal_exit[i]/1.3;//3.2
//              计算最短到达第i根竹竿底部的距离
                time_bottom[i]=Math.min(bottom1,bottom2);//3.2
//                计算到达第i根竹竿传送门入口的最短时间
//                到达传送门入口的第一种方式:从底部爬到入口
                double time_entrance1=time_bottom[i]+portal_entrance[i]/0.7;
//                 到达传送门入口的第二种方式:从传送门的出口爬到入口
                double time_entrance2=0;
                if (portal_entrance[i]>=portal_exit[i]){//如果入口在出口上面,向上爬
                    time_entrance2=time_portal[i-1]+(portal_entrance[i]-portal_exit[i])/0.7;
                }else {
                    time_entrance2=time_portal[i-1]+(portal_exit[i]-portal_entrance[i])/1.3;
                }
//                从两种方式中取最短时间
                time_portal[i]=Math.min(time_entrance1,time_entrance2);

            }
            }
        System.out.printf("%.2f",time_bottom[n-1]);
        }
}

写下血与泪的教训:时间的数据类型一定要用double不然数据量太大精度不够不能通过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Linux中进行OpenSSH升级

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 OpenSSL和OpenSSH都要更新&#xff0c;OpenSSH依赖于OpenSSL。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ssh -V 第二步&#xff0c;安装、启动telnet&#xff0c;关闭安全文件&a…

免费AI软件开发工具测评:iFlyCode VS CodeFlying

前言 Hello&#xff0c;各位看官&#xff0c;今天为大家带来两款人工智能的软件开发工具的测评&#xff0c;他们分别是iFlyCode和CodeFlying&#xff0c;我相信当大家看到这两款产品名字的时候不禁都会有些好奇&#xff0c;两个产品都有Code 和Fly两个元素&#xff0c;那他们之…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

若依上传文件/common/upload踩坑

前言&#xff1a;作者用的mac系统&#xff08;这个是个坑&#xff09;&#xff0c;前端用的uniapp&#xff0c;调用若依通用上传方法报错NoSuchFileException: /home/ruoyi/uploadPath/upload... 前端上传代码示例如下: uni.chooseImage({count: 1,success(res){ uni.uploa…

在centos8中部署Tomcat和Jenkins

参考链接&#xff1a;tomcat安装和部署jenkins_jenkins和tomcat-CSDN博客 1、进入centos中 /usr/local 目录文件下 [rootlocalhost webapps]# cd /usr/local2、使用通过wget命令下下载tomcat或者直接在官网下载centos版本的包后移动到centos中的local路径下 3、下载tomcat按…

1307页字节跳动Android面试全套真题解析在互联网火了-,完整版开放下载

多进程带来的问题 AIDL 使用浅析binder 原理解析binder 最底层解析多进程通信方式以及带来的问题多进程通信方式对比 Android 高级必备 &#xff1a;AMS,WMS,PMS AMS,WMS,PMS 创建过程 AMS,WMS,PMS全解析AMS启动流程WindowManagerService启动过程解析PMS 启动流程解析 A…

PyTorch之完整的神经网络模型训练

简单的示例&#xff1a; 在PyTorch中&#xff0c;可以使用nn.Module类来定义神经网络模型。以下是一个示例的神经网络模型定义的代码&#xff1a; import torch import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义神经…

DPN网络

DPN DPN&#xff08;Dual Path Networks&#xff09;是一种网络结构&#xff0c;它结合了DensNet和ResNetXt两种思想的优点。这种结构的目的是通过不同的路径来利用神经网络的不同特性&#xff0c;从而提高模型的效率和性能。 DenseNet 的特点是其稠密连接路径&#xff0c;使…

【Python】新手入门学习:详细介绍开放封闭原则(OCP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍开放封闭原则&#xff08;OCP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

「哈哥赠书活动 - 50期」-『AI赋能写作:AI大模型高效写作一本通』

⭐️ 赠书 - 《AI赋能写作&#xff1a;AI大模型高效写作一本通》 ⭐️ 内容简介 本书以ChatGPT为科技行业带来的颠覆性革新为起点&#xff0c;深入探讨了人工智能大模型如何为我们的创作提供强大支持。本书旨在帮助创作者更好地理解AI的价值&#xff0c;并充分利用其能力提升写…

复习C的内存管理

来自&#xff1a;漫谈C语言内存管理_c语言内存管理机制-CSDN博客 C语言学习笔记 —— 内存管理_c语言内存管理-CSDN博客 C语言是音视频开发所必须的。 变量是一段连续内存空间的别名。变量的类型是固定内存大小的别名。但是类型不是只确定了变量内存大小&#xff0c;还确定了…

代码随想录-java-栈与队列总结

栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。栈是一种线性表&#xff0c;限定这种线性表只能在某一端进行插入和删除操作。进行操作的这一端称为栈顶。 队列&#xff08;Queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextPicker)

滑动选择文本内容的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextPicker(options?: {range: string[] | string[][] | Resource | TextPickerRangeContent[] | Te…

自动生成单元测试、外挂开源代码库等新功能,上线JetBrains IDEs的CodeGeeX插件!

CodeGeeX第三代模型发布后&#xff0c;多项基于第三代模型能力的新功能今天也同步上线JetBrains IDEs全家桶。 用户可以在IDEA、PyCharm等JetBrains系的IDE中&#xff0c;搜索下载CodeGeeX v2.5.0版本&#xff0c;深度使用最新功能。 一、新模型加持的代码补全和智能问答 …

【Java基础概述-8】Lambda表达式概述、方法引用、Stream流的使用

1、Lambda表达式概述 什么是Lambda表达式? Lambda表达式是JDK1.8之后的新技术&#xff0c;是一种代码的新语法。 是一种特殊写法。 作用&#xff1a;“核心的目的是为了简化匿名内部类的写法”。 Lambda表达式的格式&#xff1a; (匿名内部类被重写的形参列表){ 被重写的代码 …

[MYSQL数据库]--表内操作(CURD)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的 Cre…

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀【文末送书-38】

文章目录 Python驱动的金融智能&#xff1a;数据分析、交易策略与风险管理Python在金融数据分析中的应用 实战案例&#xff1a;基于ChatGPT的金融事件预测AI时代Python金融大数据分析实战&#xff1a;ChatGPT让金融大数据分析插上翅膀【文末送书-38】 Python驱动的金融智能&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TimePicker)

时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时及分钟。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TimePicker(options?: TimePickerOptions)…

【计算机网络】HTTPS协议

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;网络原理&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 HTTPS是什么&#xff1f; 为什么要加密&#xff1f; …

如何选择最佳文档管理系统?2024年11款企业DMS详细评测!

11款文档管理系统 (DMS)包括&#xff1a;1.PingCode 知识库&#xff1b;2.DocuWare &#xff1b;3.Dropbox Business &#xff1b;4.eFileCabinet &#xff1b;5.Google Drive &#xff1b;6.Laserfiche &#xff1b;7.LogicalDOC &#xff1b;8.M-Files &#xff1b;9.OnlyOff…