第十四届蓝桥杯蜗牛

蜗牛 线性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];//1time_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];//1time_portal[0]=tree[0]+portal_entrance[0]/0.7;//2.4for (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.mzph.cn/news/742310.shtml

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

相关文章

[实战]API防护破解之签名验签

前言&#xff1a; 传统的接口在传输的过程中&#xff0c;是非常容易被抓包进行篡改&#xff0c;从而进行中间人攻击。这时候我们可以通过对参数进行签名验证&#xff0c;如果参数与签名值不匹配&#xff0c;则请求不通过&#xff0c;直接返回错误信息&#xff0c;从而防止黑客…

混合A*源码解读(c++)

基于ros中通过slam建立的栅格地图&#xff0c;使用混合A*进行路径规划。 首先是run_hybrid_astar.cpp: #include "hybrid_a_star/hybrid_a_star_flow.h" #include "3rd/backward.hpp" #include <ros/ros.h>namespace backward { backward::SignalHa…

使用hashmap优化时间复杂度,leetcode1577

1577. 数的平方等于两数乘积的方法数 已解答 中等 相关标签 相关企业 提示 给你两个整数数组 nums1 和 nums2 &#xff0c;请你返回根据以下规则形成的三元组的数目&#xff08;类型 1 和类型 2 &#xff09;&#xff1a; 类型 1&#xff1a;三元组 (i, j, k) &#xff…

题目 3150: 冶炼金属

题目描述: 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0c;无法…

OpenCV加载视频

一、加载视频 //视频路径QString appPath QCoreApplication::applicationDirPath();QString videoPath appPath "/vtest.avi";cv::VideoCapture capture;capture.open(videoPath.toStdString(),CAP_FFMPEG);//从摄像头读取//capture.open(0, CAP_DSHOW);cv::Mat f…

【趣味学算法】04_与谁结婚(逻辑推断|条件组合)

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 有三对情侣要结婚&…

带钢切割控制液压比例阀放大器

比例阀控制器放大器放大板技术是电液比例控制系统中的重要组成部分&#xff0c;它负责对比例阀进行精确控制&#xff0c;以实现对液压系统中流量、压力等参数的精细调节。可以实现对液压流量或压力的精确控制&#xff0c;从而使系统以更高的精度和更快的响应速度执行各种操作。…

以102flowers数据集为例训练ResNet50模型

以102flowers数据集为例训练ResNet50模型 使用飞桨高阶API&#xff0c;使用最少的代码量&#xff0c;实现在102flowers数据集训练ResNet50模型。同时可以一条命令修改成Mnist、Cifar10、Cifar100等数据集&#xff0c;换成其它模型也是只需要一句话代码。 数据集介绍 102flowe…

二叉排序树删(15.6)

#include <stdio.h> #include <stdlib.h> ///二叉排序树&#xff0c;中序遍历&#xff0c;查找typedef int KeyType; typedef struct BSTNode{KeyType key;struct BSTNode *lchild,*rchild; }BSTNode,*BiTree;//二叉查找树核心 //非递归创建二叉查找树 int BST_Ins…

java是不是没有指针呢?

在Java中&#xff0c;与C语言相比&#xff0c;指针的使用是受到限制的。Java的设计初衷是为了提供更高的安全性和可靠性&#xff0c;因此它采用了一些机制来避免常见的指针错误。 具体来说&#xff0c;Java中没有像C语言中那样的显式指针操作。Java中的引用可以看作是一种类似…

Zoho Mail有微信小程序啦!从微信就能直接收发邮件

Zoho Mail有微信小程序啦&#xff01;从微信就能直接收发邮件。可实现&#xff1a;从微信直接查看邮件、撰写新邮件、回复邮件。对于那些想从手机访问Zoho Mail企业邮箱来收发邮件&#xff0c;但又不想下载Zoho Mail 的手机app来占用手机存储的用户来说&#xff0c;微信小程序实…

Celery知识

celery介绍 # celery 的概念&#xff1a; * 翻译过来是芹菜 * 官网&#xff1a;https://docs.celeryq.dev/en/stable/ # 是分布式的异步任务框架&#xff1a; 分布式&#xff1a;一个任务&#xff0c;拆成多个任务在不同机器上做 异步任务&#xff1a;后台执行…

【开源】SpringBoot框架开发软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

Rust 如何优雅关闭 channel

在 Rust 的标准库中&#xff0c;std::sync::mpsc::channel 提供了一个多生产者单消费者的 channel 实现。这个 channel 并不直接支持“优雅关闭”的概念&#xff0c;因为发送端&#xff08;tx&#xff09;和接收端&#xff08;rx&#xff09;是通过独立的对象表示的&#xff0c…

python 基础练习题

目录 1、定义两个变量&#xff0c;交换两个变量【使用多种方式】 2、给定成绩&#xff0c;判断用户成绩的档次 3. 作业&#xff1a;下列哪一项是“4是奇数或-9为正数”的否定&#xff08; &#xff09; 4. 作业&#xff1a;判断一个整数是奇数还是偶数 5. 求矩形的面积和周…

Mysql8.0.30数据data目录文件解释

数据库内存和磁盘架构 data目录展示 [rootDESKTOP-9ADRUGP data]# pwd /usr/local/software/mysql/3312/data [rootDESKTOP-9ADRUGP data]# ls -l total 96616 -rw-r----- 1 systemd-coredump input 56 Jul 24 2023 auto.cnf -rw-r----- 1 systemd-coredump input 30…

Python的自定义数据格式

在Python中&#xff0c;自定义数据格式通常涉及到创建自定义的数据类型或类。这些类可以封装数据并定义如何处理这些数据。以下是一些关于如何在Python中自定义数据格式的详细解释&#xff1a; 1. 定义类 首先&#xff0c;你需要定义一个类来表示你的自定义数据格式。这个类可…

ElasticSearch 搜索推荐

Term Suggester "suggest_mode":"missing" missing 默认选项&#xff0c;不返回精准匹配到的分词结果 "suggest_mode":"popular" popular 大于等于搜索词频率的返回 "suggest_mode":"always", 不做任何限制&qu…

数据库基础理论知识

1.基本概念 数据(Data)&#xff1a;数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB)&#xff1a;在计算机内&#xff0c;永久存储、有组织、可共享的数据集合数据库管理系统(DBMS)&#xff1a;管理数据库的系统软件数据库系统(DBS)&#xff1a;DBDBM…

深入理解现代软件开发中的数据格式与模式

引言 在现代软件开发中&#xff0c;数据的格式和模式起着至关重要的作用。数据格式定义了数据的结构和表示方式&#xff0c;而数据模式则规定了数据的组织结构、约束条件和关联关系。正确选择和使用适当的数据格式和模式不仅有助于提高数据的可读性和可维护性&#xff0c;还能…