蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

news2024/9/19 6:00:16

题目链接:

1.蜗牛 - 蓝桥云课 (lanqiao.cn)

思路说明:

首先,考虑DFS暴力解:对于蜗牛来说,它出发的起点可能是:

1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi,

那么他有三种方式走,

  1. 从Xi竹竿底部沿着x轴爬过去到Xi+1
  2. 从bi向上或者向下爬到ai,通过传送门到达下一根竿,也就是(xi+1,bi+1)
  3.  从bi直接滑到当前竹竿底部

这就形成了dfs三个递归搜索的分支,终止条件是到达目标点,剪枝函数是所用时间大于已经找到的最小时间(初始值设置为原点到目标点的x差值)时,返回。

需要参数保存当前的x,y坐标,当前已经花了的时间,因为竹竿和传送门保存在数组里,我们需要传递索引来确定走到哪一根竹竿了。

注意:结果要保留两位小数,可以使用c语言的格式控制。

每个dfs的条件(见程序),最后一根竿是没有传送门的,所以最后一根杆不能走传送门 的dfs,要进行判断。

还有从第一根竿开始,最后结果还要加上原点到第一根竿的时间。

DFS代码如下:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int ans = 0;
vector<int> x;
vector<int> a,b;
int n=0;
double mint=0;
void dfs(int cx,int cy,double t,int i){
	if(t>mint)  return;
	if(cx==x[n]&&cy==0){
		if(t<mint){
			mint=t;
		}
		return;
	}
	
/*	
	错误代码:在选择爬到该杆子的a[i]使用魔法时,没有考虑到用魔法跳到下一根杆子的时候,不是从0往上爬,而是根据跳到的bi+1(cy)与ai+1的相对位置
	决定向上 还是 向下爬 ,爬的距离是cy和ai+1的相对距离 
	if(cy==0) dfs(x[i+1],b[i+1],t+a[i]/0.7,i+1);
	if(cy==0) dfs(x[i+1],0,t+(x[i+1]-x[i]),i+1);	
	if(cy>0) dfs(x[i],0,t+cy/1.3,i);*/
	
	
	//注意 
	if(cy>=a[i]&&cx!=x[n]) dfs(x[i+1],b[i+1],t+(cy-a[i])/1.3,i+1);
	if(cy<a[i]&&cx!=x[n])  dfs(x[i+1],b[i+1],t+(a[i]-cy)/0.7,i+1);
	
	if(cy>0)  dfs(x[i],0,t+cy/1.3,i);
	if(cy==0&&cx!=x[n]) dfs(x[i+1],0,t+(x[i+1]-x[i]),i+1);	
}

signed main() {

    cin.tie(0);
    cout.tie(0);
    cin>>n;
    x.push_back(0);a.push_back(0);b.push_back(0);b.push_back(0);
    for(int i=1;i<=n;i++){
    	int xi;
    	cin>>xi;
    	x.push_back(xi);
	}
    for(int i=1;i<=n-1;i++){
    	int ai,bj;
    	cin>>ai>>bj;
    	a.push_back(ai);
    	b.push_back(bj);
	}

	mint=x[n]-x[1];
   
   dfs(x[1],0,0,1);
   
   printf("%.2f",mint+x[1]);
    return 0;
}

在比赛中,首先要保证暴力做出来拿到一些分数,再考虑优化。由于n的数据范围到达了10^{5}

所以肯定是会超时的,时间复杂度O(3^{n})。于是考虑动态规划。

//怎么比较自然地想到动态规划的解决方式: 
//考虑达到终点即xn竹竿的底部(xn,0)的方式,可以从 (Xn-1,0)沿着x轴爬过去,或者从(Xn-1 ,a[n-1])
//通过传送门到达(Xn ,b[n]) , 再从这个地方顺着竹竿下滑到达 (xn,0)
//如果只使用一个dp数组保存到达xi竹竿底部的最短时间,我们无法计算出到达xi+1底部的最短时间
//因为无法确认求出来的当前最短时间是否是从传送门终点滑下来的还是从上一个竹竿沿着x轴爬过来的   
//所以还需要一个dp数组来保存到达每根竹竿的传送门起点的最短时间 

//这提示我们,线性的动态规划可能需要不止一个dp数组来递推,根据需要来设计 

关于递推公式,网上题解已经足够丰富,不再赘述。

代码如下:

//#include<iostream>
//#include<queue>
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e5+10;
int ans = 0;
vector<int> x;
vector<int> a,b;
int n=0;
//double mint=0;
double bottom[N],tran[N];


//怎么比较自然地想到动态规划的解决方式: 
//考虑达到终点即xn竹竿的底部(xn,0)的方式,可以从 (Xn-1,0)沿着x轴爬过去,或者从(Xn-1 ,a[n-1])
//通过传送门到达(Xn ,b[n]) , 再从这个地方顺着竹竿下滑到达 (xn,0)
//如果只使用一个dp数组保存到达xi竹竿底部的最短时间,我们无法计算出到达xi+1底部的最短时间
//因为无法确认求出来的当前最短时间是否是从传送门终点滑下来的还是从上一个竹竿沿着x轴爬过来的   
//所以还需要一个dp数组来保存到达每根竹竿的传送门起点的最短时间 

//这提示我们,线性的动态规划可能需要不止一个dp数组来递推,根据需要来设计 

signed main() {

    cin.tie(0);
    cout.tie(0);
    cin>>n;
    x.push_back(0);a.push_back(0);b.push_back(0);b.push_back(0);
    for(int i=1;i<=n;i++){
    	int xi;
    	cin>>xi;
    	x.push_back(xi);
	}
    for(int i=1;i<=n-1;i++){
    	int ai,bj;
    	cin>>ai>>bj;
    	a.push_back(ai);
    	b.push_back(bj);
	}
    
    bottom[1]=x[1],tran[1]=x[1]+a[1]/0.7;
    
    for(int i=2;i<=n;i++){
    	bottom[i]=min(bottom[i-1]+x[i]-x[i-1],tran[i-1]+b[i]/1.3);
    
    double dis=0;
    if(b[i]>=a[i])  dis=(b[i]-a[i])/1.3;
    else dis=(a[i]-b[i])/0.7;
    tran[i]=min(bottom[i-1]+x[i]-x[i-1]+a[i]/0.7,tran[i-1]+dis);
	}
    
   
   //保留两位小数 
   printf("%.2f",bottom[n]);
    return 0;
}




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

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

相关文章

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象&#xff0c;作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言&#xff0c;用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性&#xff0c;看看各个字段的注释&#xff0c;可是打开一看&#xff0c;居然是乱码的&#xff0c;如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据&#xff0c; Scanner inputnew Scanner(System.in)&#xff1b; 导包的方式: 什么是导包&#xff0c;导入的是jdk提供的java开发工具包&#xff0c;我们建一个java文件&#xff0c;psvm快捷输入后&#xff0c;打上new S…

预约陪诊APP定制开发方案以及流程详解

随着医疗行业的快速发展&#xff0c;越来越多的人开始关注自己的健康问题。然而&#xff0c;在看病的过程中&#xff0c;很多人都会感到孤独和无助。为了解决这个问题&#xff0c;许多医疗机构和企业推出了预约陪诊APP,旨在为用户提供一个安全、便捷的陪伴服务。本文将详细介绍…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

【漏洞复现】金和OA IncentivePlanFulfill.aspx SQL注入漏洞

0x01 产品简介 金和OA协同办公管理系统C6软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#xff0c;充分体现企事业单位规范管理、提高办公效…

基于Springboot的农产品销售管理系统+数据库+免费远程调试

项目介绍: 基于Springboot的农产品销售管理系统。Javaee项目&#xff0c;springboot项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过SpringMvc SpringBootMybatisVuemaven来实现。MyS…

大数据--hdfs--java编程

环境&#xff1a; virtualbox ubantu1604 Linux idea社区版2023 jdk1.8 hadoop相关依赖 使用java操作 1. 判断/user/stu/input/test.txt文件是否存在&#xff0c;存在则读出文件内容&#xff0c;打印在控制台上。反之&#xff0c;输出“文件不存在”。 package abc;impo…

5 线程网格、线程块以及线程(2)

5.3 线程块 即使有512个线程&#xff0c;也不能让你在GPU上斩获颇丰。对很多在CPU上编程的编程人员来说&#xff0c;这似乎是一个很大的数量&#xff0c;但其实在GPU上编程的时候&#xff0c;512个线程并不一定会让你获得很高的效益&#xff0c;对于GPU而言&#xff0c;通常我…

PTA L2-026 小字辈

本题给定一个庞大家族的家谱&#xff0c;要请你给出最小一辈的名单。 输入格式&#xff1a; 输入在第一行给出家族人口总数 N&#xff08;不超过 100 000 的正整数&#xff09; —— 简单起见&#xff0c;我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号&#xff0c;…

使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓,并自动部署到服务器启动服务

文章目录 使用阿里CICD流水线打包Java项目到阿里的docker镜像私仓&#xff0c;并自动部署到服务器启动服务1、功能原理实现2、将自己的Java项目通过Git上传到阿里的代码仓库中&#xff0c;也可以通过绑定Gitee或者GitHub账号进行导入3、创建自己的阿里云镜像私仓3、进入阿里的C…

【SpringBoot】如何定义接口

定义get接口 使用GetMapping定义一个基本get接口 RestController //表示定义一个json格式返回给前端 public class test {private Map<String,Object> map new HashMap<>();GetMapping(value "/test") //定义接口路径public Object userInfo(Strin…

C语言自定义类型结构体

variable adj.易变的&#xff0c;多变的&#xff1b;时好时坏的&#xff1b;可变的&#xff0c;可调节的&#xff1b; &#xff08;数&#xff09;&#xff08;数字&#xff09;变量的&#xff1b;&#xff08;植&#xff0c;动&#xff09;变异的&#xff0c;变型的&#xff1…

普发Pfeiffer分子泵TPH2101PUP/PCCT安装使用维护说明

普发Pfeiffer分子泵TPH2101PUP/PCCT安装使用维护说明

代码随想录算法训练营第31天| 455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干 题目链接&#xff1a;分发饼干 题目描述&#xff1a;假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最…

FloodFill算法——图像渲染

文章目录 题目解析题目内容解读 算法解析代码解析 题目解析 首先我们先来看看题目&#xff1a;图像渲染 题目内容解读 我们来解读一下题目内容这个题目的意思其实就是有一个如下图所示的二维矩阵 这个题目的意思在这类题目中也是非常标准的&#xff0c;就是给我们一个二维数…

docker的部署与安装以及部署一个docker(容器)应用及docker容器常出现的问题

docker 架构图 一、docker的部署与安装 1、在 CentOS 上安装 Docker 移除旧版本&#xff08;如果有的话&#xff09;&#xff1a;sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-…

用vscode调试cpp程序相关操作记录

需要在服务器上用vscode调试cpp程序&#xff0c;写此记录launch.json配置和相关步骤错误导致的问题 1.在需要运行程序的服务器上安装C/C Extension Pack&#xff08;之前只在本地装了&#xff09;&#xff0c;可以支持调试C/C应用程序(设置断点&#xff0c;单步执行&#xff0c…