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

题目链接:

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.mzph.cn/news/763860.shtml

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

相关文章

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…

2024年阿里云2核4G服务器价格30元、165元和199元1年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

element-table 悬浮header

/* * table-sticky.js 混入函数 * 组件需要提供parent字段&#xff0c;指定表格的className&#xff08;字符串&#xff09; * 在页面局部组件使用此组件&#xff0c;如果局部组件有使用display为none,会导致header头显示不全&#xff0c;可使用v-if重新初始化组件 */const …

babel主要内容

定义 babel是一个编译工具 &#xff0c;用于把JSX等编译成浏览器可执行的javascript。 主要内容是几个包babel/parser 这个包主要是用于解析代码到AST树babel/types 这个包中有一堆API&#xff0c;用于手动创建ASTbabel/traverse 这个包主要是为了遍历AST树&#xff0c;结合具体…

Python计算机二级选择易错题(二)

选择题第07&#xff0c;05&#xff0c;01套 题目来源&#xff1a;python计算机二级真题&#xff08;选择题&#xff09; - 知乎 选择题第07套 选择题第05套 选择题第01套 ​​​​ s.index(x)或s.index(x,i,j)返回序列s从i开始到j位置中第一次出现元素x的位置 ​​​​​​

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据

2001-2023年中国各省市级是否属于“开通高铁”城市匹配数据 1、时间&#xff1a;2001-2023年 2、范围&#xff1a;300个地级市&#xff08;包括直辖市&#xff09; 3、来源&#xff1a;历年中国铁道出版社出版的《全国铁路旅客列车时刻表》 4、用途&#xff1a;高铁开通可作…

Unity---Lua语言

Lua Binaries Download 13.2 逻辑热更新——Lua1-3_哔哩哔哩_bilibili nil表示空 只有false和nil为false&#xff0c;其他值都为true ..连接两个字符串

实景户外亲子公园剧本杀小程序开发搭建

实景户外亲子公园剧本杀小程序开发搭建需要以下步骤&#xff1a; 1. 确定需求和功能&#xff1a;根据客户需求和剧本杀游戏的特点&#xff0c;确定小程序需要实现的功能和界面设计。 2. 选择开发平台&#xff1a;选择适合小程序的开发平台&#xff0c;如微信小程序、支付宝小…

java 泛型(下)

本篇文章主要说明的是类型通配符、可变参数、可变参数的使用等。 在学习之前&#xff0c;希望能对泛型有个大概了解&#xff0c;可参考链接 java 泛型&#xff08;上&#xff09;-CSDN博客 也希望对泛型类、泛型接口、泛型方法有个大概的认识及使用&#xff0c;可参考链接 j…

数据类型转换篇(一)

文章目录 7.1 ascii()7.2 bin()7.3 bool()7.4 bytearray()7.5 bytes()7.6 chr()7.8 complex()7.9 dict()7.10 eval() 7.1 ascii() ascii() 是 Python 的内置函数&#xff0c;用于将一个对象转换为其“ASCII”表示形式。具体来说&#xff0c;它返回一个字符串&#xff0c;该字符…

什么是485数据采集模块?

在工业自动化、智能楼宇、环境监测等众多领域&#xff0c;数据的采集与传输是实现智能化管理的关键。而485数据采集模块&#xff0c;作为一种高效、稳定的数据采集设备&#xff0c;正日益受到广泛关注。HiWoo Box&#xff0c;作为一款卓越的485数据采集模块&#xff0c;以其强大…

Maven 环境一键部署

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Penpad 生态资产 $PDD 即将LaunchPad ,一文读懂Season 2 规则

Penpad 是 Scroll 上的 LauncPad 平台&#xff0c;该平台继承了 Scroll 底层的技术优势&#xff0c;并基于零知识证明技术&#xff0c;推出了系列功能包括账户抽象化、灵活的挖矿功能&#xff0c;并将在未来实现合规为 RWA 等资产登录 Scroll 生态构建基础。该平台被认为是绝大…

前端快速实现点击图片下载

目录 方法一&#xff1a;同源使用标签下载图片 方法二&#xff1a;跨域使用将canvas上的内容转换为Blob对象并下载 在前端开发中&#xff0c;有时候我们需要实现点击图片后直接下载的功能。本文将介绍两种方法来实现这一功能&#xff1a; 同源使用<a>标签下载图片跨域使…

安卓面试题多线程 121-125

121. 简述当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法 ?如果其他方法没有 synchronized 的话,其他线程是可以进入的。 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的122. 简述乐观锁和悲观锁的理解及如何…

C++概述

目录 一、C关键字&#xff08;63个&#xff09; 二、C几个关键点&#xff1a; 三、C语言缺陷一&#xff1a;命名冲突 四、C新概念&#xff1a;命名空间&#xff08;namespace&#xff09; 五、命名空间的嵌套&#xff1a; 六、展开命名空间&#xff1a;&#xff08;using …

切面类、注解、自定义切面类、自定义注解、如何通过注解实现切面类

1. 注解和切面类之间的关系 注解和切面类通常是配合使用的&#xff1a; 注解&#xff1a;用来标记代码&#xff0c;声明某个方法或类需要被特定的切面逻辑所增强。切面类&#xff1a;包含增强逻辑&#xff0c;它通过"切点"&#xff08;Pointcut&#xff09;来匹配被…

独家,澳门地区倾斜摄影OSGB数据免费领取

上一篇文章分享了如何将谷歌倾斜摄影原始数据如何转换成3DTiles的几种思路&#xff0c;并说明谷歌倾斜摄影3DTiles转换工具的技术先进性&#xff0c;同时也对谷歌倾斜摄影转换OSGB的几种技术思路做了对比&#xff0c;根据对比可知&#xff0c;谷歌倾斜摄影OSGB转换工具在生产效…

【No.14】蓝桥杯贪心法|最少硬币问题|活动安排问题(4)|翻硬币|快乐司机|防御力|答疑(C++)

算法优点 容易理解&#xff1a;生活常见 操作简单&#xff1a;在每一步都选局部最优 效率高&#xff1a;复杂度常常是O(1)的 算法缺点 局部最优不一定是全局最优 贪心算法&#xff08;Greedy algorithm&#xff09;&#xff0c;又称贪婪算法。是一种在每一步选择中都采取在…

小红书离线数仓提效新思路,提升百倍回刷性能

数据处理效率一直是大数据时代的核心话题&#xff0c;它推动着各类数据执行引擎持续迭代产品。从早期的 MapReduce&#xff0c;到今天的 Spark&#xff0c;各行业正不断演进其离线数仓技术架构。 现有以 Spark 为核心的数仓架构在处理大规模数据回刷方面已取得进展&#xff0c;…