第十四届蓝桥杯蜗牛

news2024/11/20 15:30:59

蜗牛 线性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不然数据量太大精度不够不能通过。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《详解:鸿蒙NEXT开发核心技术》

我们现在都知道鸿蒙作为一个国产的全栈自研系统&#xff0c;经过国家主推后。已经引起人们很大的关注&#xff0c;其中作为开发者来说&#xff1b;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了&#xff0c;目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…

Unity制作马赛克效果

大家好&#xff0c;我是阿赵。   之前在玩怒之铁拳4里面&#xff0c;看到了马赛克场景转换的效果&#xff0c;觉得很有趣&#xff0c;于是也来做一下。 一、2D版本的马赛克转场效果 先看看视频效果&#xff1a; 马赛克转场 这里我是直接写shader实现的&#xff0c;我这里是把…

sqlite3——数据库——day2

今天学习了sqlite3数据库 sqlite3_open sqlite3_openint sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */); 功能:打开数据库文件(创建一个数据库连接) 参数:filename:数据库文件路径 ppDb:操作数…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

前端请求到 SpringMVC 的处理流程

1. 发起请求 客户端通过 HTTP 协议向服务器发起请求。 2. 前端控制器&#xff08;DispatcherServlet&#xff09; 这个请求会先到前端控制器 DispatcherServlet&#xff0c;它是整个流程的入口点&#xff0c;负责接收请求并将其分发给相应的处理器。 3. 处理器映射&#xf…

安卓项目:app注册/登录界面设计

目录 第一步&#xff1a;设计视图xml 第二步&#xff1a;编写登录和注册逻辑代码 运行效果展示&#xff1a; 总结&#xff1a; 提前展示项目结构&#xff1a; 第一步&#xff1a;设计视图xml 在layout目录下面创建activity_login.xml和activity_main.xml文件 activity_lo…

rust学习(手动写一个线程池)

哈哈&#xff0c;主要是为了练习一下rust的语法&#xff0c;不喜勿喷。 一.Executor申明 struct AExecutor<T> {results:Arc<Mutex<HashMap<u32,T>>>, //1functions:Arc<Mutex<Vec<ATask<T>>>> //2 } 1.results&#xff1a…

docker-compose up -d使用遇到问题no configuration file provided: not found

docker-compose up -d使用遇到问题&#xff0c;因为你文件名称没指定&#xff0c; 又找不到默认的文件名称&#xff1b;如果该目录下有个文件叫docker-compose.yml时&#xff0c;那么可以直接使用docker-compose up -d;否则就要使用docker-compose -f mysql up -d

IP数据报格式

每一行都由32位比特&#xff0c;即4个字节组成&#xff0c;每个格子称为字段或者域。IP数据报由20字节的固定部分和最大40字节的可变部分组成。 总长度 总长度为16个比特&#xff0c;该字段的取值以字节为单位&#xff0c;用来表示IPv4数据报的长度(首部长度数据载荷长度)最大…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户&#xff0c;我们通常会选择CICD工具来减少人力投入产生的成本&#xff0c;开源的工具比如有成熟的Jenkins&#xff0c;但是本文讲的是阿里云提高的解决方案云效平台&#xff0c;通过配置流水线的形式实现项目的快速部署到服务器…

(第73天)DBUA 升级:单机 11GR2 升级到 19C

前言 Oracle 11GR2 版本是上一个长期稳定版本,但是官方已与 2020 年停止服务,官方建议升级到最新长期稳定版 19C。 参考官方文档:当前数据库版本的发行时间表 (Doc ID 1626244.1) Database Upgrade Assistant (DBUA) 交互式的引导我们完成升级数据库的步骤,它会自动执行为…

前端去除网页水印

按F12&#xff0c;打开开发者工具面板&#xff0c;然后直接在样式搜索backgroud 然后直接取消backgroud 的复选框即可。

每天五分钟计算机视觉:图像数据不足带来的问题和解决办法

本文重点 在当今的数字时代,图像数据的应用已经渗透到各个领域,包括但不限于计算机视觉、机器学习、自动驾驶、医疗诊断等。然而,当图像数据不足时,会引发一系列问题,对相关应用产生负面影响。 尤其是计算机视觉领域,图像数据尤为珍贵和稀缺,如果计算机视觉的任务中,如…

Linux本地搭建FastDFS系统

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Git版本工具学习

目录 版本控制git配置工作区域文件状态git对象模型基础命令.gitignore忽略文件IDEA集成Git 版本控制 本地版本控制&#xff1a;在本地记录每一次版本更新。 集中版本控制&#xff1a;版本数据都保存在单一服务器&#xff0c;不联网就看不到版本信息。SVN 分布式版本控制&…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

吴恩达机器学习-可选的实验室-正则化成本和梯度(Regularized Cost and Gradient)

文章目录 目标添加正则化正则化代价函数正则化梯度下降重新运行过拟合示例恭喜 目标 在本实验中&#xff0c;你将: 用正则化项扩展前面的线性和逻辑代价函数。重新运行前面添加正则化项的过拟合示例。 import numpy as np %matplotlib widget import matplotlib.pyplot as p…

Xterminal:未来的终端体验

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

关于类和对象超级初级小白知识

下面的内容只是一小部分&#xff0c;在整个面向对象的知识中并不完整&#xff0c;用于记忆和梳理 目录 前言&#xff1a;类和对象是什么&#xff1f; 一、定义类 1.如何定义类 2.类的注意事项 二.类的实例化 1.创建对象的基础知识 2.如何创建对象 3.实例化举例 4.访问对象…

软考75-上午题-【面向对象技术3-设计模式】-设计模式的要素

一、题型概括 上午、下午题&#xff08;试题五、试题六&#xff0c;二选一&#xff09; 每一个设计模式都有一个对应的类图。 二、23种设计模式 创建型设计模式&#xff1a;5 结构型设计模式&#xff1a;7 行为设计模式&#xff1a;11 考试考1-2种。 三、设计模式的要素 3…